黑白棋子的移动

描述

 

 

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

○○○○○●●●●●

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

○●○●○●○●○●

任务:编程打印出移动过程。

 

 

输入

 

 

输入n(4<=n<=10)。

 

 

输出

 

 

初始到目标的所有步骤,具体看样例。

 

 

样例输入

 

样例输出

 解题思路: 从边界开始手动模拟 找递归条件即可

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 #include <cstring>
 5 #include <cstdlib>
 6 using namespace std;
 7 
 8 int n,step;
 9 int positionone,positiontwo;
10 char ss[35];
11 
12 
13 void Print(){
14     printf("step %d:",step++);
15     printf("%s\n",ss+1);
16 }
17 
18 void Move(int Position){
19     ss[positionone]=ss[Position];
20     ss[positiontwo]=ss[Position+1];
21     ss[Position]=ss[Position+1]='-';
22     positionone=Position;
23     positiontwo=Position+1;
24     Print();
25 }
26 
27 void Calculation(int n){
28     if(n==4){
29         Move(4),Move(8),Move(2),Move(7),Move(1);
30     }
31     else{
32         Move(n),Move((n<<1)-1),Calculation(n-1);
33     }
34 }
35 
36 int main(){
37     cin>>n;
38     for(int i=1;i<=n;i++) ss[i]='o';
39     for(int i=n+1;i<=2*n;i++) ss[i]='*';
40     ss[2*n+1]=ss[2*n+2]='-';
41     Print();
42     positionone=2*n+1,positiontwo=2*n+2;
43     Calculation(n);
44 }
View Code

 

posted @ 2019-07-25 15:28  厂长在线养猪  Views(157)  Comments(0Edit  收藏  举报