这道题比较难
题目描述:
有2n个棋子(n≥4)排成一行,开始位置为白色全部在左边,黑色全部在右边。(其中字母O表示白色棋子,字母X表示黑色棋子)OOOOXXXX。移动棋子的规则是:每次必须同时移动相邻两个棋子,颜色不限,可以左移也可以右移一空位上去,但不能调换两个棋子的左右位,每次移动必须跳过若干个棋子(不能平移),要求最后能够移成黑白相间的一行棋子。例如当n=4时,最终排列情况为:OXOXOXOX。输出棋子移动的过程。
输入描述:
多组输入,每组一个正整数,占一行。
输出描述:
输出移动步骤,每一步操作占一行
样例输入:
4
样例输出:
4,5-->9,10
8,9-->4,5
2,3-->8,9
7,8-->2,3
1,2-->7,8
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 using namespace std; 5 int n,mj,mi,x,y; 6 char a[101]; 7 void move(int i) 8 { 9 a[mj] = a[i]; 10 a[mj + 1] = a[i + 1]; 11 a[i] = ‘-‘; 12 a[i + 1] = ‘-‘; 13 mj = i; 14 for(i = 0; i < 2 * n + 2; i++) 15 //printf("%c", a[i]); 16 if(a[i]==‘-‘){ 17 cout<<i+1<<","<<i+2<<"-->"<<x<<","<<y; 18 x=i+1; 19 y=i+2; 20 break; 21 } 22 printf("\n"); 23 } 24 void fun(int n) 25 { 26 if (n == 4){ 27 move(3);move(7); 28 move(1);move(6); 29 move(0); 30 } 31 else{ 32 move(n - 1); 33 move(2 * n - 2); 34 fun(n - 1); 35 } 36 } 37 int main() 38 { 39 int i, j; 40 while(cin>>n){ 41 mi = 1; 42 mj = 2* n; 43 for(i = 0; i < n; i++) 44 a[i] = ‘o‘; 45 46 for(i = n; i < 2 * n; i++) 47 a[i] = ‘*‘; 48 a[2*n] = ‘-‘; 49 a[2*n + 1] = ‘-‘; 50 x=2*n+1; 51 y=2*n+2; 52 fun(n); 53 } 54 return 0; 55 }
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 using namespace std; 5 int n, mj; 6 int mi; 7 char a[101]; 8 void move(int i) 9 { 10 a[mj] = a[i]; 11 a[mj + 1] = a[i + 1]; 12 a[i] = ‘-‘; 13 a[i + 1] = ‘-‘; 14 mj = i; 15 printf("step%2d:", mi++); 16 for(i = 0; i < 2 * n + 2; i++) 17 printf("%c", a[i]); 18 printf("\n"); 19 } 20 void fun(int n) 21 { 22 if (n == 4){ 23 move(3);move(7); 24 move(1);move(6); 25 move(0); 26 } 27 else{ 28 move(n - 1); 29 move(2 * n - 2); 30 fun(n - 1); 31 } 32 } 33 int main() 34 { 35 int i, j; 36 scanf("%d", &n); 37 mi = 1; 38 mj = 2* n; 39 for(i = 0; i < n; i++) 40 a[i] = ‘o‘; 41 42 for(i = n; i < 2 * n; i++) 43 a[i] = ‘*‘; 44 45 a[2*n] = ‘-‘; 46 a[2*n + 1] = ‘-‘; 47 printf("step%2d:", 0); 48 for(i = 0; i < 2 * n + 2; i++) 49 printf("%c", a[i]); 50 puts(""); 51 fun(n); 52 return 0; 53 }