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

文章目录

  • 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 --; // 上一步移动完,就新摆好了一粒棋子,所以要-1r -= 2; // 摆好的两个棋子就不算在区间里了// 2.把--移到右边已经摆好的o*左侧,让未修改序列中间的o和*凑到一块// 本质是:把[r-(cnt-1),r]的所有字符左移两位,然后把--放到r和r-1for(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://xiahunao.cn/news/3246302.html

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

相关文章

fastapi入门教程

☆ FASTAPI 前期准备 运行环境和安装 安装python环境安装fastapi安装uvicron 开始使用fastapi 01.第一个简单程序 from fastapi import FastAPI app FastAPI() app.get("/") def read_root():return {"Hello": "World"}运行&#xff1a;…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【获取密钥属性(ArkTS)】

获取密钥属性(ArkTS) HUKS提供了接口供业务获取指定密钥的相关属性。在获取指定密钥属性前&#xff0c;需要确保已在HUKS中生成或导入持久化存储的密钥。 开发步骤 指定待查询的密钥别名keyAlias&#xff0c;密钥别名最大长度为64字节。调用接口[getKeyItemProperties]&…

Large Language Model系列之一:语言模型与表征学习(Language Models and Representation Learning)

语言模型与表征学习&#xff08;Language Models and Representation Learning&#xff09; 1 语言模型 N-Gram模型 from collections import defaultdictsentences [The swift fox jumps over the lazy dog.,The swift river flows under the ancient bridge.,The swift br…

羊大师提醒:夏日防溺水,安全记心间

夏日炎炎&#xff0c;阳光洒满大地&#xff0c;带来了无尽的活力与欢乐&#xff0c;但在这欢快的季节里&#xff0c;也潜藏着不容忽视的安全隐患——溺水事故。为了您和家人的幸福安康&#xff0c;我们特别提醒&#xff1a;“夏日防溺水&#xff0c;安全记心间”。 夏日是游泳戏…

快手开源LivePortrait,实现表情姿态极速迁移,GitHub 6.5K Star

近日&#xff0c;快手可灵大模型团队开源了名为LivePortrait的可控人像视频生成框架&#xff0c;能够准确、实时地将驱动视频的表情、姿态迁移到静态或动态人像视频上&#xff0c;生成极具表现力的视频结果。如下动图所示&#xff1a; 来自网友测试LivePortrait 来自网友测试Li…

世界启动Ⅱ--LLM的隐私问题

前言 本文的目的是关注大语言模型 (LLM)所面临的挑战以及便利性和隐私性之间的权衡&#xff0c;以帮助您决定哪种途径最适合您。 在处理传统软件时&#xff0c;隐私问题通常围绕数据存储、传输和访问控制。我们实施加密、设置安全数据库并谨慎管理用户权限。然而&#xff0c;…

JAVA零基础学习1(CMD、JDK、环境变量、变量和键盘键入、IDEA)

JAVA零基础学习1&#xff08;CMD、JDK、环境变量、变量和键盘键入、IDEA&#xff09; CMD常见命令配置环境变量JDK的下载和安装变量变量的声明和初始化声明变量初始化变量 变量的类型变量的作用域变量命名规则示例代码 键盘键入使用 Scanner 类读取输入步骤示例代码 常用方法处…

世界启动Ⅲ--什么是 Transformer?

前言 Transformer 本质上是神经网络。专门从数据中学习上下文的神经网络。 但它们的特殊之处在于存在一些机制&#xff0c;可以消除对标记数据集以及网络中的卷积或循环的需求。 这些特殊机制是什么&#xff1f; 有很多。但真正推动 Transformer 发展的两种机制是注意力加权…

git 代理错误拒绝连接

git 克隆项目拒绝连接 现象 Failed to connect to 127.0.0.1 port 15732: 拒绝连接 问题描述 代理错误解决方法 取消代理 git config --global --unset http.proxy

艺术创作的新维度:yicaiai照片风格化

艺术创作的新维度&#xff1a;yicaiai照片风格化 一、用户友好的设计理念 1.1 yicaiai照片风格化的核心设计理念 yicaiai平台以其创新的AI技术&#xff0c;颠覆了传统照片处理的方式&#xff0c;将艺术与科技完美融合。其核心设计理念在于赋予普通照片无尽的艺术潜力&#xf…

【C++编程】双端数组 deque 容器基本操作

&#x1f525; 特点&#xff1a;deque 头插、头删速度比 vector 快 deque 是一个双向队列&#xff08;double-ended queue&#xff09;&#xff0c;可以在队列的两端进行元素的插入和删除操作。 deque 涵盖了 queue&#xff08;队列&#xff09;、stack&#xff08;堆栈&#x…

Spring Security Oauth2源码分析

Spring Security Oauth2源码分析 前言一&#xff1a;客户端OAuth2授权请求的入口1、DefaultOAuth2AuthorizationRequestResolver类OAuth2AuthorizationRequest类authorizationRequestUri 的构建机制redirectUri 3、OAuth2AuthorizationRequestRedirectFilter类 二&#xff1a;O…

元宇宙深入解析

元宇宙&#xff08;Metaverse&#xff09;是一个新兴的概念&#xff0c;它激发了技术专家、艺术家和商业领袖的无限想象。它代表着数字互动的新前沿&#xff0c;提供了一个平行的数字宇宙&#xff0c;用户可以在其中实时互动&#xff0c;超越物理世界的限制。 元宇宙是什么&am…

前端开发体系+html文件详解

目录 html骨架 body主体内基本元素 基本元素 超文本&#xff08;超链接跳转&#xff09; 锚点 图片标签 列表标签 表格标签 框架标签&#xff08;窗口标签&#xff09; 音频标签 视频标签 VScode编译器 输入框 字体样式 实例展示&#xff1a; 首先简要介绍前端的整…

Windows与Linux双机热备软件推荐

网络数据安全在如今信息化的时代越来越变得举足轻重&#xff0c;因此服务器维护和管理也成为企业健康稳定运营的一项重要工作。但实际情况是很多公司并没有配备专业的运维人员&#xff0c;一般都会通过一些管理软件维护或者主机托管给服务商。整理6款服务器的Windows与Linux双机…

【Vue】Vue3 安装 Tailwind CSS 入门

初始化 Vue 3 项目 npm install -g vue/cli vue create my-project安装 Tailwind CSS 进入你的项目目录&#xff0c;然后安装 Tailwind CSS 和其依赖项&#xff1a; npm install -D tailwindcss postcss autoprefixer配置 PostCSS Tailwind CSS 需要通过 PostCSS 进行处理。…

类和对象的简述(c++篇)

开局之前&#xff0c;先来个小插曲&#xff0c;放松一下&#xff1a; 让我们的熊二来消灭所有bug 各位&#xff0c;在这祝我们&#xff1a; 放松过后&#xff0c;开始步入正轨吧。爱学习的铁子们&#xff1a; 目录&#xff1a; 一类的定义&#xff1a; 1.简述&#xff1a; 2…

飞睿智能UWB Tag蓝牙防丢器标签,宠物安全新升级,5cm精准定位测距不迷路

宠物早已成为许多家庭不可或缺的一员&#xff0c;它们用无条件的爱温暖着我们的心房&#xff0c;陪伴我们度过每一个平凡而温馨的日子。然而&#xff0c;随着宠物活动范围的扩大和外界环境的复杂多变&#xff0c;宠物走失的风险也随之增加。每一次出门遛弯&#xff0c;都像是心…

补充.IDEA的使用

首先我们要了解在idea中Java工程由项目&#xff08;project&#xff09;、模块&#xff08;module&#xff09;包&#xff08;package&#xff09;、类&#xff08;class&#xff09;组成。 他们之间的关系是project包含module包含package包含class。 所以我们要按照先建一个pr…

心理健康服务小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;最新资讯管理&#xff0c;心理产品管理&#xff0c;产品分类管理&#xff0c;音乐理疗管理&#xff0c;试题管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;心理产品音…