【C++】题解:P1259 黑白棋子的移动_递归+模拟_算法竞赛_洛谷

news2024/9/24 3:18:52

文章目录

  • P1259 黑白棋子的移动 题解
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 提示
    • 解题思路
    • AC Code
    • End

P1259 黑白棋子的移动 题解

Link:Luogu - P1259

题目描述

2 n 2n 2n 个棋子排成一行,开始为位置白子全部在左边,黑子全部在右边,如下图为 n = 5 n=5 n=5 的情况:

移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置。每次移动必须跳过若干个棋子(不能平移),要求最后能移成黑白相间的一行棋子。如 n = 5 n=5 n=5 时,成为:

任务:编程打印出移动过程。

输入格式

一个整数 n n n

输出格式

若干行,表示初始状态和每次移动的状态,用 o \verb!o! o 表示白子, * \verb!*! * 表示黑子, - \verb!-! - 表示空行。

样例 #1

样例输入 #1

7

样例输出 #1

ooooooo*******--
oooooo--******o*
oooooo******--o*
ooooo--*****o*o*
ooooo*****--o*o*
oooo--****o*o*o*
oooo****--o*o*o*
ooo--***o*o*o*o*
ooo*o**--*o*o*o*
o--*o**oo*o*o*o*
o*o*o*--o*o*o*o*
--o*o*o*o*o*o*o*

提示

4 ≤ n ≤ 100 4\leq n\leq 100 4n100


解题思路

提示:这里先看懂思路就行,不用细究下标什么的问题。看代码时再看。

这道题一看就是一个细节模拟题。

可以直接找规律,以样例为例,从第 2 行开始,每两行为一组。
每一组操作如下:

  1. 先把 -- 移到还未修改序列的中间(把一对 o* 放到最右边);
  2. 再把 -- 移到右边已经摆好的 o* 左侧,让未修改序列中间的 o*凑到一块。

然后,不难看出序列长度一定是偶数,且每次进行的操作都是一样的,符合递归结构。可以从右往左递归模拟这个过程。

但这样到最后会出问题,因为后面的一些字符不符合上述规律……???
在这里插入图片描述


请大家肃静!(敲锤子)

我们发现这也是一个分治, n n n 经过第一次处理后,剩下的 [ 1 , ( 2 n + 2 ) − 2 ] [1,(2n + 2) - 2] [1,(2n+2)2] 区间里的字符就可以看作是 n − 1 n-1 n1 的答案。

然后,题目给的 n n n 下界为 4 4 4,所以当 n = 4 n=4 n=4之后的操作就不符合上面规律了。

但又发现 n = 4 n=4 n=4时前面的答案固定,只有后面多出来一些 o*o*......

所以直接在代码中用一个 t t t 记录现在的 n n n到多少了,每次递归 t − 1 t-1 t1。如果 t = 4 t=4 t=4 直接输出固定答案返回即可。

声明:这看似是投机取巧,实则是游戏的必然规律。请不要误解。

AC Code

提示:代码里的许多下标操作都很复杂,干看肯定看不明白。一定一定在草稿纸上模拟一遍,你就会恍然大悟。所以,这种模拟题一定要自己写一遍才有感觉(

#include <bits/stdc++.h>
using namespace std;

int n;
char s[210]; // 注意空间要开到2*n+2以上

/*
@param l,r 当前操作区间为[l,r],提示左右端点
@param cnt 表示当前剩余黑棋子的个数(白棋子个数与其相等)
@param t   当前分治的“n”是多少
*/
void work(int l, int r, int cnt, int t){ 
	if(t == 4){ // 终止条件
		cout << "ooo--***o*"; for(int i = 1; i <= n-4; i ++){cout << "o*";} cout << endl;
		cout << "ooo*o**--*"; for(int i = 1; i <= n-4; i ++){cout << "o*";} cout << endl;
		cout << "o--*o**oo*"; for(int i = 1; i <= n-4; i ++){cout << "o*";} cout << endl;
		cout << "o*o*o*--o*"; for(int i = 1; i <= n-4; i ++){cout << "o*";} cout << endl;
		cout << "--o*o*o*o*"; for(int i = 1; i <= n-4; i ++){cout << "o*";} cout << endl; 
		return ;
	}
	
	// 1.把--移到待修改序列的中间,把一对o*放到最后
	int mid = (r - 2) / 2; // 中间靠左字符的为止,-2是把最右边的--减去
	s[mid] = s[mid + 1] = '-';
	s[r] = '*', s[r - 1] = 'o';
	cout << (s + 1) << endl;
	
	// 中间处理
	cnt --; // 上一步移动完,就新摆好了一粒棋子,所以要-1
	r -= 2; // 摆好的两个棋子就不算在区间里了
	
	// 2.把--移到右边已经摆好的o*左侧,让未修改序列中间的o和*凑到一块
	// 本质是:把[r-(cnt-1),r]的所有字符左移两位,然后把--放到r和r-1
	for(int i = r-(cnt-1); i <= r; i ++) s[i - 2] = s[i];
	s[r] = s[r - 1] = '-';
	cout << (s + 1) << endl;
	
	// 3.继续递归
	work(1, r, cnt, t - 1);
}

void solve()
{
	cin >> n;
	// 构造原始字符串
	for(int i = 1; i <= n; i ++) s[i] = 'o';
	for(int i = 1; i <= n; i ++) s[n + i] = '*';
	s[2*n + 1] = s[2*n + 2] = '-';
	// 先输出一次原串
	cout << (s + 1) << '\n';
	// 递归求解
	work(1, 2*n + 2, n, n);
}

signed main()
{
	ios :: sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
	solve();
	return 0;
}

End

模拟是算法竞赛的基础能力。希望大家能把模拟和找规律的能力都练扎实了,这样才能在赛时发挥出稳定的成绩。

让我们一起进步吧,拜拜ヾ(•ω•`)o

推销个人洛谷博客、洛谷主页。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1929656.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

habase集群安装

解压到/opt/softs目录 tar -zxvf hbase-2.4.11-bin.tar.gz -C /opt/softs/ 改名 mv hbase-2.4.11/ hbase2.4.11 配置环境变量 修改/etc/profile vim /etc/profile 添加 #HBASE_HOME export HBASE_HOME/opt/softs/hbase2.4.11 export PATH$PATH:$HBASE_HOME/bin 修改其中的…

Redis的单线程讲解与指令学习

目录 一.Redis的命令 二.数据类型 三.Redis的key的过期策略如何实现&#xff1f; 四.Redis为什么是单线程的 五.String有关的命令 Redis的学习专栏&#xff1a;http://t.csdnimg.cn/a8cvV 一.Redis的命令 两个基本命令 在Redis当中&#xff0c;有两个基本命令&#xff1…

【计算机网络】网络基础概念

目录 一、初识网络协议 1.1 简单理解 1.2 OSI七层模型 1.3 TCP/IP四层(或五层)模型 二、网络传输基本流程 2.1 概念 2.2 报头 三、网络中的地址管理 3.1 认识IP地址 3.2 端口号 3.3 Mac地址 四、认识TCP协议和UDP协议 五、网络字节序 六、socket编程接口 6.1 so…

2024Datawhale AI夏令营---Inclusion・The Global Multimedia Deepfake Detection--学习笔记

赛题背景&#xff1a; 其实总结起来就是一句话&#xff0c;这个项目是基于目前的深度伪装技术&#xff0c;就是通过大量人脸的原数据集进行模型训练之后&#xff0c;能够生成伪造的人脸视频。这项目就是教我们如何去实现这个DeepFake技术。 Task1:了解Deepfake和跑通baseline …

电脑鼠标连点工具哪家强?2024最新鼠标连点器工具分享

在现代计算机使用中&#xff0c;鼠标作为最主要的输入设备之一&#xff0c;在日常操作和特定应用中发挥着关键作用。然而&#xff0c;某些任务可能要求用户频繁点击鼠标&#xff0c;这不仅繁琐乏味&#xff0c;还可能导致手部疲劳。为了解决这一问题&#xff0c;自动鼠标点击工…

初始c语言(2)运算符与表达式

一 c语言提供的运算符类型 以上会后续介绍 二 现阶段我们掌握如下的基本操作符 注意&#xff01;计算机的除法只会保留整数部分&#xff08;若被除数未负则不同的软件取整的结果不唯一&#xff09; 三 自加&#xff08;&#xff09;自减&#xff08;--&#xff09;符号 若为…

【区块链 + 智慧政务】区块链 +ETC 下一代公路联网收费关键技术优化项目 | FISCO BCOS应用案例

2020 年&#xff0c;我国取消省界收费站项目完成后&#xff0c;随着收费模式与收费方式的变化&#xff0c;形成了以门架为计费单元的新收 费体系&#xff1a;按照车辆通行门架数&#xff0c;RSU 天线读取 ETC 卡、电子标签 OBU 或 CPC 卡内标识的车型信息&#xff0c;车型门架计…

SQL去重的四种方法

去重是指&#xff1a;查询的时候, 不显示重复&#xff0c;并不是删除表中的重复项 数据表&#xff1a; 方法1&#xff1a;distinct去重 作用&#xff1a;只能一列去重&#xff0c;当distinct后跟大于1个参数时&#xff0c;他们之间的关系是&&(逻辑与)关系&#xff0c;…

vue2学习笔记7 - Vue中的MVVM模型

MVVM Model-View-viewModel是一种软件架构模式&#xff0c;用于将用户界面&#xff08;View&#xff09;与业务逻辑&#xff08;Model&#xff09;分离&#xff0c;并通过ViewModel进行连接和协调。MVVM模式的目标是实现视图与模型的解耦&#xff0c;提高代码的可读性、可维护…

Qt | 绘制椭圆、弧、弦、扇形、圆角矩形

点击上方"蓝字"关注我们 01、简介 1、需要使用到的 QPainter 类中的函数 2、绘制椭圆的方法有 绘制给定矩形的内接椭圆和根据中心点与椭圆 x 方向和 y 方向的半径绘制,原理见下图 3、绘制弧、弦、扇形的原理: 1)、弧是椭圆上的一段曲线,因此其绘制方法就是首先…

【Apache Doris】周FAQ集锦:第 14 期

【Apache Doris】周FAQ集锦&#xff1a;第 14 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目&#xff01; 在这个栏目中&#xff0c;每周将筛选社区反馈的热门问题和话题&#xff0c;重点回答并进行深入探讨。旨在为广大用户…

企业全历史行为数据助ToB企业决策层开启营销的上帝视角

“上帝视角”是每个企业家都渴望拥有的。上帝视角的能力有多么吸引人呢&#xff1f;通常&#xff0c;一个企业家在技术、产品、营销中的任何一个领域拥有上帝视角的能力&#xff0c;就足可以让他的企业大杀四方&#xff0c;甚至创造历史。 在技术或产品领域&#xff0c;靠“上…

10.1 标注、注记图层和注记整体说明

文章目录 前言标注、注记图层和注记QGis中的标注QGis中的注释(Annotation)图层QGis中的注记 总结 前言 介绍标注、注记图层和注记说明&#xff1a;文章中的示例代码均来自开源项目qgis_cpp_api_apps 标注、注记图层和注记 有时地图需要使用一些文字信息说明其中的地理要素或其…

Android 性能优化之卡顿优化

文章目录 Android 性能优化之卡顿优化卡顿检测TraceView配置缺点 StricktMode配置违规代码 BlockCanary配置问题代码缺点 ANRANR原因ANRWatchDog监测解决方案 Android 性能优化之卡顿优化 卡顿检测 TraceViewStricktModelBlockCanary TraceView 配置 Debug.startMethodTra…

Python中的数据结构:五彩斑斓的糖果盒

在Python编程的世界里&#xff0c;数据结构就像是一个个五彩斑斓的糖果盒&#xff0c;每一种糖果都有其独特的味道和形状。这些多姿多彩&#xff0c;形状和味道各异的糖果盒子包括了&#xff1a;List&#xff08;列表&#xff09;、Tuple&#xff08;元组&#xff09;、Diction…

Redis主从部署

主从部署 整体架构图 需要再建两个CentOs7,过程重复单机部署 查看自己ip地址命令 ifconfig 192.168.187.137 进入redis所在目录 cd /opt/software/redis cd redis-stable 进入配置文件 vim redis.conf 修改分身1、2的配置文件 搜索replicaof replicaof 192.168.187.137 63…

笔记 2 : 课本第 3 章开始,记录 arm 的汇编指令的格式

&#xff08;13&#xff09; 介绍 arm 中的第一个汇编指令的用法 mov &#xff1a; &#xff08;14&#xff09;立即数的概念&#xff1a; &#xff08;15&#xff09; 汇编中的移位写法&#xff1a; 举例 &#xff1a; &#xff08;16&#xff09; 学习一个新的指令 cmp &a…

二叉树相关理论知识

二叉树是计算机科学中一种基础且重要的数据结构&#xff0c;它属于树形结构的一个重要类型。以下是二叉树的理论基础&#xff0c;包括定义、基本形态、特殊类型、性质以及遍历方式等方面的内容。 一、定义 二叉树&#xff08;Binary Tree&#xff09;是n&#xff08;n≥0&…

【实战系列】PostgreSQL 专栏,基于 PostgreSQL 16 版本

我的 PostgreSQL 专栏介绍及进度 20240715&#xff1a;目前整体进度已完成 85%&#xff0c;完成 16 万字&#xff0c;还有近 5 万字就截稿了。 (venv312) ➜ mypostgres git:(dev) sh scripts/word_statistics_pg_style.sh Filename …

15分钟快速了解图新地球能做什么,解决什么问题,快速入门

1.图新地球桌面端是什么 1.1官方定义 图新地球桌面端(LSV)是一款集多源数据加载、应用分析、演示汇报为一体的三维GIS 软件。采用了中科图新自主研发的国产三维地图引擎&#xff0c;支持各类无人机航测、CAD、BIM、规划成果等多源数据的加载融合;实现了BIMGIS 技术在实际业务…