福利-青蛙過河
今天給大家發一個福利,確切的說,玩一個青蛙過河的小遊戲。
遊戲規則:
有7個石墩排成一排,左邊三個石墩上各站著一只綠色的青蛙,右邊三個石墩上各站著一只棕色的青蛙,正中間的一個石墩空著。每只青蛙只能移動到相鄰的空位或跳過一只青蛙。綠青蛙只能往右跳,棕青蛙只能往左跳。看你能不能把兩種顏色的青蛙互換位置。
體驗一下
你成功了嗎?
如果你沒成功的話,網頁上有答案的鏈接。
如果每種顏色的青蛙各有n只,那麽該怎麽辦呢?
【輸入】
一個整數n,表示每種顏色的青蛙的只數
【輸出】
解決方案
【樣例輸入1】
3
【樣例輸出1】
Step 0: 1 1 1 0 2 2 2
Step 1: 1 1 0 1 2 2 2
Step 2: 1 1 2 1 0 2 2
Step 3: 1 1 2 1 2 0 2
Step 4: 1 1 2 0 2 1 2
Step 5: 1 0 2 1 2 1 2
Step 6: 0 1 2 1 2 1 2
Step 7: 2 1 0 1 2 1 2
Step 8: 2 1 2 1 0 1 2
Step 9: 2 1 2 1 2 1 0
Step 10: 2 1 2 1 2 0 1
Step 11: 2 1 2 0 2 1 1
Step 12: 2 0 2 1 2 1 1
Step 13: 2 2 0 1 2 1 1
Step 14: 2 2 2 1 0 1 1
Step 15: 2 2 2 0 1 1 1
【樣例輸入2】
4
【樣例輸出2】
Step 0: 1 1 1 1 0 2 2 2 2
Step 1: 1 1 1 0 1 2 2 2 2
Step 2: 1 1 1 2 1 0 2 2 2
Step 3: 1 1 1 2 1 2 0 2 2
Step 4: 1 1 1 2 0 2 1 2 2
Step 5: 1 1 0 2 1 2 1 2 2
Step 6: 1 0 1 2 1 2 1 2 2
Step 7: 1 2 1 0 1 2 1 2 2
Step 8: 1 2 1 2 1 0 1 2 2
Step 9: 1 2 1 2 1 2 1 0 2
Step 10: 1 2 1 2 1 2 1 2 0
Step 11: 1 2 1 2 1 2 0 2 1
Step 12: 1 2 1 2 0 2 1 2 1
Step 13: 1 2 0 2 1 2 1 2 1
Step 14: 0 2 1 2 1 2 1 2 1
Step 15: 2 0 1 2 1 2 1 2 1
Step 16: 2 2 1 0 1 2 1 2 1
Step 17: 2 2 1 2 1 0 1 2 1
Step 18: 2 2 1 2 1 2 1 0 1
Step 19: 2 2 1 2 1 2 0 1 1
Step 20: 2 2 1 2 0 2 1 1 1
Step 21: 2 2 0 2 1 2 1 1 1
Step 22: 2 2 2 0 1 2 1 1 1
Step 23: 2 2 2 2 1 0 1 1 1
Step 24: 2 2 2 2 0 1 1 1 1
題解:
遊戲玩久了就會發現,如果中途兩只同色青蛙挨在一起,稍後就會寸步難行。
分析數據後,我們先規定每次操作要移動的青蛙編號(顏色,1或2),再定義三個操作:
跳:讓規定的青蛙跳過一只青蛙(規定青蛙編號=1,序列12012,操作後變為02112)
進:讓規定的青蛙往前跳一格(規定青蛙編號=2,序列102,操作後變為120)
換:交換規定的青蛙的編號(規定青蛙編號=1,操作後規定青蛙編號=2,再操作後規定青蛙編號=1)
流程如下(想想為什麽):
規定青蛙編號=1
輸入n
跳0次,進1次,換
跳1次,進1次,換
跳2次,進1次,換
......
跳(n-1)次,進1次,換
跳n次,換,進1次
跳(n-1)次,換,進1次
跳(n-2)次,換,進1次
......
跳1次,換,進1次
結束
我們還需要兩個變量分別記錄規定青蛙編號和空位位置。
代碼如下:
1 #include<iostream> 2 using namespace std; 3 int n; 4 int empty;//空位位置 5 int step; 6 int a[10005]; 7 bool wf=0;//規定青蛙編號是否為2 8 void print() 9 { 10 cout<<"Step "<<step<<‘:‘; 11 for(int i=1;i<=n*2+1;i++) 12 cout<<‘ ‘<<a[i]; 13 cout<<endl; 14 step++; 15 } 16 int main() 17 { 18 cin>>n; 19 empty=n+1; 20 int i,j; 21 for(i=1;i<=n;i++) 22 { 23 a[i]=1; 24 a[i+n+1]=2; 25 } 26 print(); 27 for(i=0;i<n;i++) 28 { 29 for(j=1;j<=i;j++) 30 { 31 if(wf) 32 { 33 swap(a[empty],a[empty+2]); 34 empty+=2; 35 } 36 else 37 { 38 swap(a[empty],a[empty-2]); 39 empty-=2; 40 } 41 print(); 42 } 43 if(wf) 44 { 45 swap(a[empty],a[empty+1]); 46 empty++; 47 } 48 else 49 { 50 swap(a[empty],a[empty-1]); 51 empty--; 52 } 53 print(); 54 wf=!wf; 55 } 56 for(i=n;i>=1;i--) 57 { 58 for(j=1;j<=i;j++) 59 { 60 if(wf) 61 { 62 swap(a[empty],a[empty+2]); 63 empty+=2; 64 } 65 else 66 { 67 swap(a[empty],a[empty-2]); 68 empty-=2; 69 } 70 print(); 71 } 72 wf=!wf; 73 if(wf) 74 { 75 swap(a[empty],a[empty+1]); 76 empty++; 77 } 78 else 79 { 80 swap(a[empty],a[empty-1]); 81 empty--; 82 } 83 print(); 84 } 85 return 0; 86 }
終於打完了~
福利-青蛙過河