UVa227-Puzzle

来源:互联网 发布:二十四小时软件 编辑:程序博客网 时间:2024/06/03 21:29

UVa227-Puzzle

思路:

题意是有个5x5的板子上面有一个是空的,用空格表示,四种操作分别是ABRL,分别代表把空格上下右左的字母移动到空格处,然后给出一个初始状态,还有一系列操作输出最终状态,如果存在非法操作输出This puzzle has no final configuration.,非法操作就是越界的操作(比如空格已经在最右边了还要执行R就非法)。
这种模拟题一直都是最不愿意做的,因为细节比较多我经常会考虑不全面。
说一下坑点吧:

  • 要用gets输入因为有空格
  • 注意指令后面的换行要用getchar吃掉(大多数字符串题目都要考虑的)
  • 如果空格在末尾是没有的,要判断一下长度是不是空格在末尾

代码:

#include <bits/stdc++.h>using namespace std;char mn[6][6];int judge(int &a,int &b,int x,int y){    int px=a+x;    int py=b+y;    if(px>=0&&px<5&&py>=0&&py<5)    {        mn[a][b]=mn[px][py];        mn[px][py]=' ';        a=px;b=py;        return 1;    }    return 0;}int main(){    int kx,ky,k=1;    while(1)    {        for(int i=0;i<5;i++)        {            gets(mn[i]);            if(strlen(mn[i])==4)            {                mn[i][4]=' ';                mn[i][5]=0;            }            for(int j=0;j<5;j++)            {                if(mn[i][j]=='Z') return 0;                if(mn[i][j]==' '){kx=i;ky=j;}            }        }        char ch;int flag=1;        while(scanf("%c",&ch),ch!='0')        {            int px,py;            switch(ch)            {            case 'A':                if(flag)flag=judge(kx,ky,-1,0);                break;            case 'B':                if(flag)flag=judge(kx,ky,1,0);                break;            case 'L':                if(flag)flag=judge(kx,ky,0,-1);                break;            case 'R':                if(flag)flag=judge(kx,ky,0,1);                break;            default : ;            }        }        getchar();        if(k>1)printf("\n");        printf("Puzzle #%d:\n",k++);        if(flag)        for(int i=0;i<5;i++)        {            for(int j=0;j<5;j++)            {                printf("%c%c",mn[i][j],j==4?'\n':' ');            }        }        else            printf("This puzzle has no final configuration.\n");    }    return 0;}
原创粉丝点击