【2016.10.6NOIP普及模拟】Pond

来源:互联网 发布:一辈子单身感受知乎 编辑:程序博客网 时间:2024/06/05 04:55

题目描述:

      G最后在规定时间内完成了任务,Alice只能放行。出了房间,G的左边是一条继续前进的道路,右边是一个池塘。池塘中有序的排列着一排数量相同石块和荷叶。正在G准备向左走继续前进的时候,D和Z爬完了楼梯,出现在了池塘的另一边。D和Z可以踩着石块通过池塘,并且每步可以跨两个单位长度(假定相邻两个物体之间的距离为一个单位长度)。当前池塘中荷叶与石块的排列如下:(字母X为荷叶,O为石块)

  XXXXXOOOOO
  显而易见,D和Z是无法通过池塘的。正在她们一筹莫展的时候,G在岸边发现了一个机关。机关中的黑色白色石子分别代表石块和荷叶,移动石子便能够移动相应的石块与荷叶。移动规则如下:石子靠右排列,左侧有两个空位,每次操作可以将相邻的任意两个石子移动到空位上,但左右位置不可交换。由于G刚才搬完皇后石像,身心疲惫,她希望你帮她找到移动石子的步骤,使得D和Z可以踩着石头通过池塘。当然,时间紧迫,步骤越少越好。

输入:

一个整数n(4≤n≤30),表示石块和荷叶的数量。

输出

输出移动步骤。
其中第一行为初始状态,从左到右一次为n个荷叶,n个石块,2个空位。
最后一行为末状态,规定末状态是2个空位在最左侧。
大写字母X表示荷叶,大写字母O表示石块,下划线_表示空位。

样例输入

6

样例输出

XXXXXXOOOOOO__
XXXXX__OOOOOXO
XXXXXOOOOO__XO
XXXX__OOOOXOXO
XXXXOOOO__XOXO
XXX__OOOXOXOXO
XXXOXOO__OXOXO
X__OXOOXXOXOXO
XOXOXO__XOXOXO
__XOXOXOXOXOXO

 

题解:

           什么时候水题也有这么多字了?mdzz,明知道我有密集恐惧症,还把题目描写的辣么清楚,表示比赛的时候根本不想看啊!其实这道题说白了就是三个字——找规律。其实每一个输出都有n*2-2行,这样子我们就可以按照规律输出。但还有特殊情况的话,就只能自己慢慢算了!

 

#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>using namespace std;char a[62];int m,n;int l=0;int main(){    freopen("pond.in","r",stdin);    freopen("pond.out","w",stdout);    scanf("%d",&n);    for (int i=1;i<=n;i++)    {        a[i]='X';        printf("%c",a[i]);    }    for (int i=n+1;i<=n*2;i++)    {        a[i]='O';        printf("%c",a[i]);    }    a[n*2+1]='_';    a[n*2+2]='_';    printf("__\n");    l=n*2+2;    m=n;    while (n>3)    {           a[n*2+1]=a[n];           a[n*2+2]=a[n+1];           a[n]='_';           a[n+1]='_';           for (int i=1;i<=l;i++) printf("%c",a[i]);           printf("\n");           if (n>4)           {                   a[n]=a[n*2-1];                   a[n+1]=a[n*2];                   a[n*2-1]='_';                   a[n*2]='_';                   for (int i=1;i<=l;i++) printf("%c",a[i]);                   printf("\n");           }           n--;    }    a[5]=a[9];    a[4]=a[8];    a[9]='_';    a[8]='_';    for (int i=1;i<=l;i++) printf("%c",a[i]);    printf("\n");    a[9]=a[3];    a[8]=a[2];    a[3]='_';    a[2]='_';    for (int i=1;i<=l;i++) printf("%c",a[i]);    printf("\n");    a[3]=a[8];    a[2]=a[7];    a[8]='_';    a[7]='_';    for (int i=1;i<=l;i++) printf("%c",a[i]);    printf("\n");    a[8]=a[2];    a[7]=a[1];    a[2]='_';    a[1]='_';    for (int i=1;i<=l;i++) printf("%c",a[i]);    printf("\n");}

0 0
原创粉丝点击