当前位置: 首页 > news >正文

【题解】【分治】——黑白棋子的移动

【题解】【递归】——黑白棋子的移动

  • 黑白棋子的移动
    • 题目描述
    • 输入格式
    • 输出格式
    • 输入输出样例
      • 输入 #1
      • 输出 #1
    • 提示
  • 1.题意解析
  • 2.AC代码

黑白棋子的移动

通往洛谷的传送门

题目描述

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

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\leq n\leq 100$

1.题意解析

    仔细观察,可以发现,移动规模为 n n n的棋子,可以现将中间的两枚o*棋子移到最后,然后将*行的最后两个移到空位上来,形成了规模为 n − 1 n-1 n1的子问题,可以使用递归来解决,具体示例如下:

n=5时:
ooooo*****__
将中间的o*x代替,使演示更为直观。
ooooo*****__
移动步骤一,oooo__****xx
再将x旁边的两个棋子*替换为y
oooo__**yyxx
移动步骤二,ooooyy**__xx
再把字母替换回来:
oooo****__o*
可以发现,前面的 4 ∗ 2 = 8 4*2=8 42=8个格子形成了规模为 5 − 1 = 4 5-1=4 51=4的子问题。

    但是,看看样例 n = 4 n=4 n=4时是特殊情况,也是递归边界。这个时候,我们就直接输出就行了。详见代码。

2.AC代码

#include<bits/stdc++.h>
using namespace std;
int n;
char a[210];//存储棋盘 
void start()//初始化棋盘 
{for(int i=1;i<=n;i++)a[i]='o',a[i+n]='*';a[2*n+1]=a[2*n+2]='-';
}
void print()//打印棋盘
{for(int i=1;i<=n*2+2;i++)cout<<a[i];cout<<endl;
}
void move(int x)//移动棋子,x代表当前规模 
{if(x==4)//递归边界,x=4时是特殊情况 {cout<<"ooo--***o*";//第一次移动for(int i=1;i<=n-4;i++)cout<<'o'<<'*';//补位puts("");//换行cout<<"ooo*o**--*";//以此类推 for(int i=1;i<=n-4;i++)cout<<'o'<<'*';puts("");cout<<"o--*o**oo*";for(int i=1;i<=n-4;i++)cout<<'o'<<'*';puts("");cout<<"o*o*o*--o*";for(int i=1;i<=n-4;i++)cout<<'o'<<'*';puts("");cout<<"--o*o*o*o*";for(int i=1;i<=n-4;i++)cout<<'o'<<'*';return;}swap(a[x],a[2*x+1]);swap(a[x+1],a[2*x+2]);print();//平常情况的第一步swap(a[2*x-1],a[x]);swap(a[2*x],a[x+1]);print();//平常情况的第二步move(x-1);//递归处理 return;
}
int main()
{cin>>n;start();print();//开始先打印棋盘 move(n);//移动棋子 return 0;
}

喜欢就订阅此专辑吧!

【蓝胖子编程教育简介】
蓝胖子编程教育,是一家面向青少年的编程教育平台。平台为全国青少年提供最专业的编程教育服务,包括提供最新最详细的编程相关资讯、最专业的竞赛指导、最合理的课程规划等。本平台利用趣味性和互动性强的教学方式,旨在激发孩子们对编程的兴趣,培养他们的逻辑思维能力和创造力,让孩子们在轻松愉快的氛围中掌握编程知识,为未来科技人才的培养奠定坚实基础。

欢迎扫码关注蓝胖子编程教育
在这里插入图片描述


http://www.mrgr.cn/news/60444.html

相关文章:

  • python编程-闭包
  • uni-app应用级生命周期和页面级生命周期
  • 基于SSM+小程序民宿短租管理系统(民宿1)
  • Python中的Pyqt5详细介绍:基本机构、部件、布局管理、信号与槽、跨平台
  • MySQL 字段类型介绍
  • 堆垛机提升机构下降过程中报7901电机转速过快
  • Pytorch学习--如何下载及使用Pytorch中自带数据集,如何把数据集和transforms联合在一起使用
  • 【亲测】mini版centos7.9配置网络基础ssh等直接使用
  • Linux端使用百度网盘命令行工具深度指南
  • 运维工程师面试题
  • 《证据规定》之关于鉴定人出庭的操作性规定
  • 一篇教你“uniapp小程序 app新用户引导实现”
  • 使用 LiteLLM 或 Qwen 等 LLM API 替代 OpenAI(Swarm 中应用)
  • Spring 设计模式之工厂模式
  • HelloCTF [RCE-labs] Level 4 - SHELL 运算符
  • php字符过滤绕过方法
  • 越南有哪些主要的电商平台?越南电商什么品类比较畅销?
  • .NET Core WebApi第3讲:第一个WebApi项目、WebApi开发三种模型
  • 猎板pcb批量工厂1.5阶HDI板可直接投产
  • 【Linux】POSIX 消息队列
  • 无脑去除李贺epic注册机的三种方法
  • 最近爆火的新职业Prompt提示工程师到底是做什么的?迈向大模型第一步Prompt提示工程基础原理及实践
  • 蓝桥杯单片机STC15F2K60S2第十四届省赛代码详细讲解(附完整代码)
  • Ubuntu18.04安装velodyne驱动
  • AI-基本概念-CNN/RNN/注意力机制
  • Qt6切换音轨