今天给大家发一个福利,确切的说,玩一个青蛙过河的小游戏。

游戏规则:

有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 }

终于打完了~