版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/richenyunqi/article/details/82156276
UVA - 227. Puzzle题解
欢迎访问我的Uva题解目录https://blog.csdn.net/richenyunqi/article/details/81149109
题目描述
题意解析
一个5*5的网格,其中有一个网格是空的。A、B、L、R四种指令分别表示将空网格上下左右的相邻字母移入到空格中。输入初始网格和指令序列,要求输出最终的网格图。
注意点
输出时每两个puzzle之间都要有一个空行,但最后一个puzzle后没有空行。
C++代码
#include<bits/stdc++.h>
#define _for(i,a,b) for(int i=(a);i<(b);++i)
using namespace std;
int main(){
char puzzle[5][5];
int emptyi,emptyj;//空白方格的横纵坐标
for(int k=1;true;++k){//k表示第几场puzzle游戏
_for(i,0,5){
_for(j,0,5){
puzzle[i][j]=getchar();//读取整个puzzle
if(puzzle[0][0]=='Z')//读取到了Z字符,直接结束游戏
goto loop;
if(puzzle[i][j]==' '){//读取到了空白字符,确定空白方格的横纵坐标
emptyi=i;
emptyj=j;
}
}
getchar();//读取后面的换行符
}
if(k>1)
puts("");//输出每两个Puzzle之间的空行,注意最后一个Puzzle后没有空行
printf("Puzzle #%d:\n",k);
bool f=true;//表示有没有最终的puzzle
for(char c=getchar();c!='0';c=getchar()){//读取到字符0才算结束
int tempi=emptyi,tempj=emptyj;
if(c=='A'&&emptyi>0)
--emptyi;
else if(c=='B'&&emptyi<4)
++emptyi;
else if(c=='L'&&emptyj>0)
--emptyj;
else if(c=='R'&&emptyj<4)
++emptyj;
else if(c!='\n')//略过换行符
f=false;
if(f)
swap(puzzle[tempi][tempj],puzzle[emptyi][emptyj]);//交换两个字符
}
if(f){
_for(i,0,5){//输出整个puzzle
_for(j,0,5)
printf("%c%s",puzzle[i][j],j<4?" ":"");
puts("");
}
}else
puts("This puzzle has no final configuration.");
getchar();//读取后面的换行符
}
loop:
return 0;
}