【9702】黑白棋的移动
生活随笔
收集整理的這篇文章主要介紹了
【9702】黑白棋的移动
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Time Limit: 3 second
Memory Limit: 2 MB
【問題描述】
????有2n個棋子(n≥4)排成一行,開始位置為白子全部在左邊,黑子全部在右邊,如下圖為n=5的情形:????○○○○○●●●●●
????移動棋子的規則是:每次必須同時移動相鄰的兩個棋子,顏色不限,可以左移也可以右移到空位上去,但不能調換兩個棋子的左右位置。每次移動必須跳過若干個棋子(不能平移),要求最后能移成黑白相間的一行棋子。如n=5時,成為:
????○●○●○●○●○●
????任務:編程打印出移動過程。
【輸入格式】
????1行。n的值
【輸出格式】
????不定行,每行輸出“step +稱動的步數:黑白棋子及空位的分布情況”(即移動過程),用字母“o”表示白棋,用“*”表示黑棋,用“-”(連接符橫杠)表示空位。
【輸入樣例】
????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*step 10:o*o*o*--o*o*o*o*step 11:--o*o*o*o*o*o*o*【題解】
對于n=5的情況。
ooooo*****--
我們把5,6移到空位。
oooo--****o*
然后把靠后的連續兩個*移到空位;
oooo****--o*
對。1-10又變成n=4的情況了。
然后n=6也可以按照上面的方法轉換成n=5的情況。然后再轉換成n=4的情況。
以此類推。
然后n=4要怎么放呢?
樣例有啊!自己看嘛!
【代碼】
#include <cstdio> #include <iostream>char s[50]; int n,pkongge,ans = -1;void input_data() {scanf("%d", &n);//輸入npkongge = 2 * n + 1;//然后記錄空格的位置。 }void pri()//打印答案。 {ans++;//遞增答案printf("step %d:", ans);for (int i = 1; i <= 2 * n + 2; i++) //一位位地輸出。putchar(s[i]);printf("\n"); }void init() //初始化。 { //1-n放o,n+1-2*n放* ,2*n+1-2*n+2是空格。for (int i = 1; i <= n; i++)s[i] = 'o';for (int i = n + 1; i <= 2 * n; i++)s[i] = '*';s[2 * n + 1] = '-';s[2 * n + 2] = '-';pri();//打印答案。這是步驟0; }void swap (char &a, char &b) //交換兩個字符。 {char t;t = a;a = b;b = t; }void move(int p)//把p移到空格,p+1移到空格+1; {swap(s[p], s[pkongge]);swap(s[p + 1], s[pkongge + 1]);pkongge = p; //記錄空格新的位置pri(); //打印答案。 }void mov(int k) //移n=k時的方法。 {if (k == 4) //如果k==4了則按照樣例輸出里n==4的方法移動。{move(4); move(8); move(2); move(7); move(1);}else //否則把兩個棋子移開。然后變成k-1的移法。{move(k);move(k * 2 - 1);mov(k - 1);} }void get_ans() {mov(n);//system("pause"); 不要加上這一句!!!!!!! }int main() {input_data();init();get_ans();return 0; }
轉載于:https://www.cnblogs.com/AWCXV/p/7632311.html
總結
以上是生活随笔為你收集整理的【9702】黑白棋的移动的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库存在即更新的并发处理 - 转
- 下一篇: 配置静态IP