zoukankan      html  css  js  c++  java
  • 福利-青蛙过河

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

    游戏规则:

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

    终于打完了~

  • 相关阅读:
    还在写onClickListener()???你OUT拉
    Java 中的reference
    如何将eclipse上的android项目转移到android studio
    List,Set,Map再学习一下
    Java对象实例化的速度的一个试验
    如何自定义ImageView并让其渐变出现(李刚老师)
    android studio 中git插件的使用 github项目的配置及操作
    eGit插件
    原来Linux才是深入学习3D的好去处【原创】
    用FileMapping跨进程共享数据
  • 原文地址:https://www.cnblogs.com/jiaweigao/p/9563409.html
Copyright © 2011-2022 走看看