问题描述
C语言课设项目、小游戏大全 源 码 免 费 下 载 链 接 如 下:
有2n个棋子排成一行,开始为位置白子全部在左边,黑子全部在右边,如下图为n=5 的情况:
○○○○○●●●●●
移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置。每次移动必须跳过若干个棋子(不能平移),要求最后能移成黑白相间的一行棋子。如 n=5时,成为:
○●○●○●○●○●
任务:编程打印出移动过程。
输入
一个整数 n(4≤n≤100)。
输出
若干行,表示初始状态和每次移动的状态,用"o"表示白子,"*"表示黑子,"-"表示空行。
输入样例
7
输出样例
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*
(1)编程思路。
由输出样例可以看出,对于n>4的棋子的移动,每次移动棋子的操作可以把中间两个棋子“o*”移到最后,再把连续黑子中的后面两个棋子“**”移到中间,这样n个棋子的移动变成了n-1个棋子的移动,一直递归调用到n==4的时候,按样例固定输出即可。
(2)源程序。
#include <stdio.h>
char chess[205];
void move(int x,int y)
{
char ch;
ch=chess[x];
chess[x]=chess[y];
chess[y]=ch;
}
void work (int n)
{
int i;
if (n==4)
{
move(3,8); move(4,9);
printf("%s\n",chess);
move(3,7); move(4,8);
printf("%s\n",chess);
move(1,7); move(2,8);
printf("%s\n",chess);
move(1,6); move(2,7);
printf("%s\n",chess);
move(0,6); move(1,7);
printf("%s\n",chess);
return;
}
move(n-1,2*n);
move(n,2*n+1);
printf("%s\n",chess);
move(n-1,2*n-2);
move(n,2*n-1);
printf("%s\n",chess);
work (n-1);
}
int main()
{
int n;
scanf("%d", &n);
int i;
for (i=0;i<n;i++)
chess[i]='o';
for (i=n;i<2*n;i++)
chess[i]='*';
chess[2*n]='-';
chess[2*n+1]='-';
chess[2*n+2]='\0';
printf("%s\n",chess);
work (n);
return 0;
}