黑白棋子的移动(分治)

黑白棋子的移动(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 #include<cstdio>
 3 #include<cstdlib>
 4 using namespace std;
 5 int n,nowp,num;
 6 char c[100];
 7 void init(int);//初始化
 8 void move(int);//移动
 9 void mov(int);//移动的方案
10 int print();//输出
11 int main()
12 {
13     scanf("%d",&n);
14     init(n);//初始化
15     mov(n);//怎么移动
16     return 0;
17 }
18 int print()
19 {
20     cout<<"step "<<num<<":";
21     for(int i=1;i<=2*n+2;i++)//输出
22     cout<<c[i];
23     cout<<endl;
24     num++;
25 }
26 void init(int n)
27 {
28     nowp=n*2+1;//有‘-’的第一个位置,也就是可以将棋子移到这个位置
29     for(int i=1;i<=n;i++)c[i]=‘o‘;//初始化
30     for(int i=n+1;i<=2*n;i++)c[i]=‘*‘;
31     c[n*2+1]=‘-‘;c[n*2+2]=‘-‘;
32     print();
33 }
34 void mov(int n)//移动的方案
35 {
36     if(n==4)//如果是4*2个棋子
37     {
38         move(4);move(8);move(2);move(7);move(1);//先移动第四个位置和第五个位置,再移动第8,9...
39     }
40     else
41     {
42         move(n);move(2*n-1);mov(n-1);//前两个语句完成后,剩下棋子排列相当于移动n-1个棋子的方案
43     }
44 }
45 void move(int n)
46 {
47     for(int i=0;i<=1;i++)
48     {
49         c[nowp+i]=c[n+i];//现在有空格的位置被移动来棋子代替
50         c[n+i]=‘-‘;//移动后的位置变为‘-’;
51     }
52     nowp=n;//现在的位置要改变 ****
53     print();
54 }
时间: 2024-11-04 15:54:37

黑白棋子的移动(分治)的相关文章

【例7.6】黑白棋子的移动

[例7.6]黑白棋子的移动 链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1327时间限制: 1000 ms         内存限制: 65536 KB [题目描述] 有2n个棋子(n≥4)排成一行,开始位置为白子全部在左边,黑子全部在右边,如下图为n=5的情形: ○○○○○●●●●● 移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置.每次移动必须跳过若干个棋子(不能平移

【递归】黑白棋子的移动

描述 有2n个棋子(n≥4)排成一行,开始为位置白子全部在左边,黑子全部在右边,如下图为n=5的情况: ○○○○○●●●●● 移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置.每次移动必须跳过若干个棋子(不能平移),要求最后能移成黑白相间的一行棋子.如n=5时,成为: ○●○●○●○●○● 题目 编程打印出移动过程. 输入 一个整数n(n<=100) 输出 若干行,表示初始状态和每次移动的状态,用"o"表示白子

黑白棋子交换

问题: 在一个有七个格子的盒子里,左边放着3个白球,第四个是空的,右边三个是黑球 游戏规则: 1.一次只能移动一个棋子 2.棋子可以向空格中移动,也可以跳过一个对方的棋子进入空格. 3.白色棋子只能向右移动,黑色棋子只能向左移动,不能跳过两个子. #include <stdio.h> #include <stdlib.h> int number; void print(int a[]); void change(int *n, int *m); /* run this progra

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

分治3--黑白棋子的移动 一.心得 二.题目和分析 黑白棋子的移动(chessman) [问题描述] 有2n个棋子(n≥4)排成一行,开始位置为白子全部在左边,黑子全部在右边,如下图为n=5的情形: ○○○○○●●●●● 移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置.每次移动必须跳过若干个棋子(不能平移),要求最后能移成黑白相间的一行棋子.如n=5时,成为: ○●○●○●○●○● 任务:编程打印出移动过程. [输入样例]c

棋子翻转

题目描述 在4x4的棋盘上摆满了黑白棋子,黑白两色的位置和数目随机其中左上角坐标为(1,1),右下角坐标为(4,4),现在依次有一些翻转操作,要对一些给定支点坐标为中心的上下左右四个棋子的颜色进行翻转,请计算出翻转后的棋盘颜色. 给定两个数组A和f,分别为初始棋盘和翻转位置.其中翻转位置共有3个.请返回翻转后的棋盘. 测试样例: [[0,0,1,1],[1,0,1,0],[0,1,1,0],[0,0,1,0]],[[2,2],[3,3],[4,4]] 返回:[[0,1,1,1],[0,0,1,0

【题解】棋子

题目描述 小Z在家闲得无聊,摆弄起了围棋棋子.也许是小Z有自虐倾向,他出了个难题给自己,结果竟然把自己难住了.你作为他的朋友,决定帮助他解决难题. 有一个m×n的棋盘,需要在上面摆满黑白棋子.小Z有一个奇怪的规则:如果有两个棋子相邻(上下左右),且一白一黑.则黑的必须在上面(或左边).黑白棋子都是足够多的.小Z想知道共有多少种不同的摆法(只要略有不同就算一种). 输入格式 一行,包括两个正整数m和n. 输出格式 一行,包括一个正整数ans,表示共有多少种不同的摆法. 输入样例 2 2 输出样例

[CQOI2012]交换棋子(最小费用最大流)

[CQOI2012]交换棋子(luogu) Description 题目描述 有一个n行m列的黑白棋盘,你每次可以交换两个相邻格子(相邻是指有公共边或公共顶点)中的棋子, 最终达到目标状态.要求第i行第j列的格子只能参与mi,j次交换. 输入格式 第一行包含两个整数n,m(1<=n, m<=20).以下n行为初始状态,每行为一个包含m个字符的01串, 其中0表示黑色棋子,1表示白色棋子.以下n行为目标状态,格式同初始状态. 以下n行每行为一个包含m个0~9数字的字符串,表示每个格子参与交换的次

Codevs 1004 四子连棋

1004 四子连棋 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋一步,黑白双方交替走棋,任意一方可以先走,如果某个时刻使得任意一种颜色的棋子形成四个一线(包括斜线),这样的状态为目标棋局. ● ○ ●   ○ ● ○ ● ● ○ ● ○ ○ ● ○   输入描述 Input

1004 四子连棋

1004 四子连棋 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋一步,黑白双方交替走棋,任意一方可以先走,如果某个时刻使得任意一种颜色的棋子形成四个一线(包括斜线),这样的状态为目标棋局. ● ○ ●   ○ ● ○ ● ● ○ ● ○ ○ ● ○   输入描述 In