【递归】黑白棋子的移动

描述

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

○○○○○●●●●●

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

○●○●○●○●○●

题目

编程打印出移动过程。

输入

一个整数n(n<=100)

输出

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

输入样例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*

解题思路

  其实主要就是一种递归的思想,整体来说很简单

  大致思路就是把n个棋子转换成n-1个棋子做,由于4很特殊

  所以单独输出;

  初始化——(向后移——向前移——判断)(循环递归)——暴力枚举——输出

题解

 1 #include<bits/stdc++.h>//万能头文件
 2 using namespace std;
 3 void hou(long long n);
 4 void qian(long long n);
 5 void si(long long n);
 6 void chu(long long n);
 7 void shu(long long x);
 8 char a[100001];
 9 bool j=true;
10 long long n,x=0;
11 int main()//主程序(好少)
12 {
13
14     cin>>n;
15     chu(n);
16     return 0;
17 }
18 void chu(long long n)//初始化
19 {
20     if(j)//赋值一下
21     {
22         for(int i=1;i<=2*n;i++)//把棋子初始化
23             a[i]=‘o‘;
24         for(int i=n+1;i<=2*n;i++)
25             a[i]=‘*‘;
26         for(int i=2*n+1;i<=2*n+2;i++)
27             a[i]=‘-‘;
28         shu(x);
29         j=false;
30     }
31     if(n==4) si(n); //如果还剩四个,单独输出
32     if(n>4) hou(n); //否则继续操作
33 }
34 void hou(long long n) //向后移
35 {
36     if(a[1]!=‘-‘)
37    {
38     swap(a[n],a[2*n+1]);//交换位置
39     swap(a[n+1],a[2*n+2]);
40     shu(x);    //输出输出
41     qian(n);//做向前操作
42     }
43     else return;
44  }
45 void qian(long long n)//向前移
46 {
47     swap(a[n],a[2*n-1]);//交换为主
48     swap(a[n+1],a[2*n]);
49     n--;
50     shu(x);//一波输出
51     chu(n);//一波操作做完判断是否大于4
52 }
53 void si(long long n)//4单独输出(暴力枚举)
54 {
55     swap(a[4],a[9]);
56     swap(a[5],a[10]);
57     shu(x);
58     swap(a[4],a[8]);
59     swap(a[5],a[9]);
60     shu(x);
61     swap(a[2],a[8]);
62     swap(a[3],a[9]);
63     shu(x);
64     swap(a[2],a[7]);
65     swap(a[3],a[8]);
66     shu(x);
67     swap(a[1],a[7]);
68     swap(a[2],a[8]);
69     shu(x);
70     return;
71 }
72 void shu(long long y)//负责输出
73 {
74     for(int i=1;i<=n*2+2;i++)
75         cout<<a[i];
76     cout<<endl;
77     x++;
78 }

借鉴专用区(大家都懂)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 void hou(long long n);
 4 void qian(long long n);
 5 void si(long long n);
 6 void chu(long long n);
 7 void shu(long long x);
 8 char a[100001];
 9 bool j=true;
10 long long n,x=0;
11 int main()
12 {
13
14     cin>>n;
15     chu(n);
16     return 0;
17 }
18 void chu(long long n)
19 {
20     if(j)
21     {
22         for(int i=1;i<=2*n;i++)
23             a[i]=‘o‘;
24         for(int i=n+1;i<=2*n;i++)
25             a[i]=‘*‘;
26         for(int i=2*n+1;i<=2*n+2;i++)
27             a[i]=‘-‘;
28         shu(x);
29         j=false;
30     }
31     if(n==4) si(n);
32     if(n>4) hou(n);
33 }
34 void hou(long long n)
35 {
36     if(a[1]!=‘-‘)
37    {
38     swap(a[n],a[2*n+1]);
39     swap(a[n+1],a[2*n+2]);
40     shu(x);
41     qian(n);
42     }
43     else return;
44  }
45 void qian(long long n)
46 {
47     swap(a[n],a[2*n-1]);
48     swap(a[n+1],a[2*n]);
49     n--;
50     shu(x);
51     chu(n);
52 }
53 void si(long long n)
54 {
55     swap(a[4],a[9]);
56     swap(a[5],a[10]);
57     shu(x);
58     swap(a[4],a[8]);
59     swap(a[5],a[9]);
60     shu(x);
61     swap(a[2],a[8]);
62     swap(a[3],a[9]);
63     shu(x);
64     swap(a[2],a[7]);
65     swap(a[3],a[8]);
66     shu(x);
67     swap(a[1],a[7]);
68     swap(a[2],a[8]);
69     shu(x);
70     return;
71 }
72 void shu(long long y)
73 {
74     for(int i=1;i<=n*2+2;i++)
75         cout<<a[i];
76     cout<<endl;
77     x++;
78 }

原文地址:https://www.cnblogs.com/hualian/p/11159242.html

时间: 2024-11-06 03:52:17

【递归】黑白棋子的移动的相关文章

黑白棋子的移动(分治)

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

【例7.6】黑白棋子的移动

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

黑白棋子交换

问题: 在一个有七个格子的盒子里,左边放着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

紫书第4章 函数和递归

1  序 系统的整理下第四章的学习笔记.同上次一样,尽量在不依赖书本的情况下自己先把例题做出来.这次有许多道题代码量都比较大,在例题中我都用纯C语言编写,但由于习题的挑战性和复杂度,我最终还是决定在第五章开始前,就用C++来完成习题.不过所有的代码都是能在C++提交下AC的. 在习题中,我都习惯性的构造一个类来求解问题,从我个人角度讲,这会让我的思路清晰不少,希望自己的一些代码风格不会影响读者对解题思路的理解. 其实在第四章前,我就顾虑着是不是真的打算把题目全做了,这些题目代码量这么大,要耗费很

棋子翻转

题目描述 在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数字的字符串,表示每个格子参与交换的次

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

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

程序员的数学

第1章 0的故事——无即是有 本章学习内容 小学一年级的回忆 10进制计数法 什么是10进制计数法 分解2503 2进制计数法 什么是2进制计数法 分解1100 基数转换 计算机中为什么采用2进制计数法 按位计数法 什么是按位计数法 不使用按位计数法的罗马数字 指数法则 10的0次方是什么 10—1是什么 规则的扩展 对20进行思考 2—1是什么 0所起的作用 0的作用:占位 0的作用:统一标准,简化规则 日常生活中的0 人类的极限和构造的发现 重温历史进程 为了超越人类的极限 本章小结 第2章