UVa227-Puzzle

xiaoxiao2021-02-28  94

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; }
转载请注明原文地址: https://www.6miu.com/read-33999.html

最新回复(0)