分治3--黑白棋子的移动

分治3--黑白棋子的移动

一、心得

 

二、题目和分析

 

黑白棋子的移动(chessman
【问题描述】
有2n个棋子(n≥4)排成一行,开始位置为白子全部在左边,黑子全部在右边,如下图为n=5的情形:
○○○○○●●●●●
移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置。每次移动必须跳过若干个棋子(不能平移),要求最后能移成黑白相间的一行棋子。如n=5时,成为:
○●○●○●○●○●
任务:编程打印出移动过程。
【输入样例】chessman.in
7
【输出样例】chessman.out
step 0:ooooooo*******--
step 1:oooooo--******o*
step 2:oooooo******--o*
step 3:ooooo--*****o*o*
step 4:ooooo*****--o*o*
step 5:oooo--****o*o*o*
step 6:oooo****--o*o*o*
step 7:ooo--***o*o*o*o*
step 8:ooo*o**--*o*o*o*
step 9:o--*o**oo*o*o*o*
step10:o*o*o*--o*o*o*o*
step11:--o*o*o*o*o*o*o*
【算法分析】
我们先从n=4开始试试看,初始时:
○○○○●●●●
第1步:○○○——●●●○●  {—表示空位}
第2步:○○○●○●●——●
第3步:○——●○●●○○●
第4步:○●○●○●——○●
第5步:——○●○●○●○●
如果n=5呢?我们继续尝试,希望看出一些规律,初始时:
○○○○○●●●●●
第1步:○○○○——●●●●○●
第2步:○○○○●●●●——○●
这样,n=5的问题又分解成了n=4的情况,下面只要再做一下n=4的5个步骤就行了。同理,n=6的情况又可以分解成n=5的情况,……,所以,对于一个规模为n的问题,我们很容易地就把他分治成了规模为n-1的相同类型子问题。
刚开始一点思路都没有觉得问题特别复杂,其实根据我做的这一丢丢题看来,步骤或者说是过程描述性强的题目,都有一定的规律,可用递归递推去做。
这样的题一定有一定的规律,如当n=5时,再稍加变动就恢复n=4时的情况,这就是有规律可循了,问题就变得简单;再好比前面汉诺塔的题目,题目会仔细
说明怎样去移动,那就有规律可循了,不多解释了,和这个题情况一样,又会恢复到n-1的状态;(快夸我!QWQ)
初始化--输出--移动n个棋子(函数)--怎样移动(函数)--移动后输出(输出函数)

三、代码和结果

 

 1 #include <iostream>
 2 using namespace std;
 3 
 4 int n;
 5 int step=0;
 6 char ans[101];
 7 int sp;
 8 
 9 void print(){
10     cout<<"step"<<step<<":";
11     for(int i=1;i<=2*n+2;i++) cout<<ans[i];
12     cout<<endl;
13     step++;
14 }
15 
16 void init(int n){
17     for(int i=1;i<=n;i++) ans[i]='o';
18     for(int i=n+1;i<=2*n;i++) ans[i]='*';
19     for(int i=2*n+1;i<=2*n+2;i++) ans[i]='-';
20     print();
21     sp=2*n+1;
22 }
23 
24 void move(int k){
25     for(int i=0;i<=1;i++){
26         ans[sp+i]=ans[k+i];
27         ans[k+i]='-';// 
28     } 
29     sp=k;
30     print();// 
31 }
32 
33 void mv(int n){
34     if(n==4){
35         move(4),move(8),move(2),move(7),move(1);
36     }
37     else{
38         move(n),move(2*n-1),mv(n-1);
39     }
40 }
41 
42 int main(){
43     cin>>n;
44     init(n);
45     mv(n);
46     return 0;
47 } 

 

转载于:https://www.cnblogs.com/Renyi-Fan/p/7135800.html

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

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

相关文章

java递归查找树的节点_递归树,从叶子节点找到父节点的的各种参数包括路径

这几天有个新需求&#xff0c;无聊的报表&#xff0c;通过各种维度组合成一个树&#xff0c;点击数的节点&#xff0c;组合各种条件去查询数据&#xff0c;由于在树的不同层级&#xff0c;需要向上查找父节点&#xff0c;直到根节点的各种组合条件。所以一个基本的想法是从叶子…

cocos2dX 之数据存储

今天我们来看cocos2dX里面的数据存储类, CCUserDefault, 如今的游戏基本都会把用户信息保存下来, 以便于再次进入游戏的时候读取, 为了方便起见&#xff0c;有时我们也能够用CCUserDefault来存储金币数目这样的简单的数据项, 当然, 大型数据还是建议使用数据库 闲话不多说, 我…

前端学习(2482):关于接口的调错

request.js <template> <div class"artical-container"><!--卡片--><el-card class"filter-card"><div slot"header" class"clearfix"><!--面包屑导航--><el-breadcrumb separator-class&quo…

java 字符串数组转int数组_java怎么把字符型数组转换为int型?

展开全部String s "485729304";int[] a new int[s.length()];for(int i 0; i < s.length(); i){//先由字符串转换成char,再转换成String,然后Integera[i] Integer.parseInt( String.valueOf(s.charAt(i)));}//字符串中的数据一定要是数字&#xff0c;否则会出…

php 小知识随手记 new self() 和new static()作用和区别

A.new self() 返回代码段所以在的类 B.new static()返回的是当前实例化的类 例子&#xff1a; 转载于:https://www.cnblogs.com/walksnow/p/7141999.html

ThinkPHP框架知识的注意点

ThinkPHP框架 访问入口文件后在application文件夹中会出现一些文件夹&#xff0c;其中的home文件夹是前端模块&#xff0c;也可以在application文件夹中新建文件夹。home文件夹模块中Conf文件夹的config配置文件&#xff0c;是对于当前模块的&#xff1a;修改当前模式conventio…

什么是哈希表?

哈希表是用于查找的一种表&#xff0c;它是根据某一函数H(key)key,来确定某一元素的存储位置&#xff0c;构造哈希表的方法&#xff0c;一般有&#xff1a;或是它的线性函数&#xff0c;来构造&#xff1b;还有除留余数法等等&#xff1b;构造这种表的过程叫哈希造表&#xff0…

前端学习(2485):vue里面的this指向

一、普通函数中的this 这是vue文档里的原话&#xff1a; All lifecycle hooks are called with their this context pointing to the Vue instance invoking it. 意思是&#xff1a;在Vue所有的生命周期钩子方法&#xff08;如created&#xff0c;mounted&#xff0c; updated…

java 单元测试用例_Java单元测试和JUnit

**********************单元测试和JUnit********************************为什么要使用单元测试1.底层代码没问题,上一层才不会出现问题.. 就像盖楼一样2.提高士气&#xff0c;明确知道我的东西是没问题的, 保证你不被开3.加大测试的力度可以降低后期维护的成本一.什么是JUnitJ…

5专题总结-数据结构

专题5-数据结构 2017-07-13 C Primer P329好好研读&#xff0c;stack,queue,priority_queue都是顺序容器适配器adaptor。&#xff08;接受一种已有的容器类型&#xff0c;使其行为看起来像另一种事物一样&#xff09; 适配器的底层容器&#xff08;array和forward_list都不行&a…

mysql8.0创建属性_MySQL8.0新特性——资源管理

MySQL8.0——资源管理&#xff1a;参考官方文档&#xff1a;https://dev.mysql.com/doc/refman/8.0/en/resource-groups.htmlMySQL支持资源组的创建和管理&#xff0c;并允许将服务器内运行的线程分配给特定组&#xff0c;以便线程根据组可用的资源执行。组属性可以控制其资源&…

Ribbon自带负载均衡策略比较

Ribbon自带负载均衡策略比较 策略名策略声明策略描述实现说明BestAvailableRulepublic class BestAvailableRule extends ClientConfigEnabledRoundRobinRule选择一个最小的并发请求的server逐个考察Server&#xff0c;如果Server被tripped了&#xff0c;则忽略&#xff0c;在选…

java byte数组转int数组_Java任意长度byte数组转换为int数组的方法

前言嗯。最近工程上遇到一个byte数组转换为int的问题&#xff0c;解决过程中遇到了几个坑&#xff0c;经过各种查资料终于还是解决了。撒花。Java的位运算以及byte数组与其他类型数据的转换比c/c感觉麻烦一些。这里简单说明一下byte数组和int的转换吧。总所周知&#xff0c;int…

newcondition java_Java并发Condition接口

全屏java.util.concurrent.locks.Condition接口提供一个线程挂起执行的能力&#xff0c;直到给定的条件为真。 Condition对象必须绑定到Lock&#xff0c;并使用newCondition()方法获取对象。Condition类的方法以下是Condition类中可用的重要方法的列表。序号方法名称描述1publi…