1. 程式人生 > >福利-青蛙過河

福利-青蛙過河

我們 答案 兩種 一個 發現 ret ... mes 一起

今天給大家發一個福利,確切的說,玩一個青蛙過河的小遊戲。

遊戲規則:

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

終於打完了~

福利-青蛙過河