描述
有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 ",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 }