黑白棋子的移动(信息学奥赛一本通-T1327)
生活随笔
收集整理的這篇文章主要介紹了
黑白棋子的移动(信息学奥赛一本通-T1327)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目描述】
有2n個棋子(n≥4)排成一行,開始位置為白子全部在左邊,黑子全部在右邊,如下圖為n=5的情形:○○○○○●●●●●
移動棋子的規則是:每次必須同時移動相鄰的兩個棋子,顏色不限,可以左移也可以右移到空位上去,但不能調換兩個棋子的左右位置。每次移動必須跳過若干個棋子(不能平移),要求最后能移成黑白相間的一行棋子。如n=5時,成為:○●○●○●○●○●
任務:編程打印出移動過程。
【輸入】
輸入n。
【輸出】
移動過程。
【輸入樣例】
7
【輸出樣例】
step 0:ooooooo*******--
step 1:oooooo--******o*
step 2:oooooo******--o*
step 3:ooooo--*****o*o*
step 4:ooooo*****--o*o*
step 5:oooo--****o*o*o*
step 6:oooo****--o*o*o*
step 7:ooo--***o*o*o*o*
step 8:ooo*o**--*o*o*o*
step 9:o--*o**oo*o*o*o*
step10:o*o*o*--o*o*o*o*
step11:--o*o*o*o*o*o*o*
【源程序】
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<string> #define INF 999999999 #define N 1001 #define MOD 1000000007 using namespace std; int n,st,sp; char a[N]; void print() {printf("step%2d:",st++);for(int i=1;i<=2*n+2;i++)printf("%c",a[i]);printf("\n"); } void move(int m) {a[sp]=a[m];a[sp+1]=a[m+1];a[m]=a[m+1]='-';sp=m;print(); } void mv(int m) {if(m==4){move(4);move(8);move(2);move(7);move(1);}else{move(m);move(2*m-1);mv(m-1);} } int main() {cin>>n;for(int i=1;i<=n;i++)a[i]='o';for(int i=n+1;i<=2*n;i++)a[i]='*';for(int i=2*n+1;i<=2*n+2;i++)a[i]='-';st=0;sp=2*n+1;print();mv(n);return 0; }?
總結
以上是生活随笔為你收集整理的黑白棋子的移动(信息学奥赛一本通-T1327)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 台阶问题(洛谷-P1192)
- 下一篇: 奇怪的电梯(洛谷-P1135)