今天给大家发一个福利,确切的说,玩一个青蛙过河的小游戏。
游戏规则:
有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 }
终于打完了~