题目链接
题目分析
这道题目主要复杂度在输入和输出的处理,主要是输入的网格矩阵有空格,所以要用getchar()来进行输入,但是输入的时候又要考虑换行和最后一组输入的情况,输入指令序列也是同样的情况,可能有空白字符。模拟的时候注意数组边界即可。
源代码
#include<stdio.h>
#include<string.h>
int main() {
char p[5][5];
char ins[1005];
char ch;
int x,y,ilen,kase=1;
while(true) {
bool q=false; //输入终止标志,遇到一个开头单Z
for(int i=0;i<25;i++) {
ch=getchar();
if(ch=='\n') {
i--;
continue;
}
if(i==0&ch=='Z') {
q=true;
break;
}
if(ch==' ') {
x=i/5;
y=i%5;
}
p[i/5][i%5]=ch;
}
if(q) break;
ilen=0;
while(true) {
ch=getchar();
if(ch=='\n'||ch==' ') continue;
if(ch=='0') break;
ins[ilen++]=ch;
}
ins[ilen]='\0';
q=true; //是否有解标志
for(int i=0;i<ilen;i++) {
if(ins[i]=='L') {
if(y==0) {
q=false;
break;
} else {
ch=p[x][y];
p[x][y]=p[x][y-1];
p[x][y-1]=ch;
y--;
}
} else if(ins[i]=='R') {
if(y==4) {
q=false;
break;
} else {
ch=p[x][y];
p[x][y]=p[x][y+1];
p[x][y+1]=ch;
y++;
}
} else if(ins[i]=='A') {
if(x==0) {
q=false;
break;
} else {
ch=p[x][y];
p[x][y]=p[x-1][y];
p[x-1][y]=ch;
x--;
}
} else if(ins[i]=='B') {
if(x==4) {
q=false;
break;
} else {
ch=p[x][y];
p[x][y]=p[x+1][y];
p[x+1][y]=ch;
x++;
}
}
}
if(kase==1) printf("Puzzle #%d:\n",kase++);
else printf("\nPuzzle #%d:\n",kase++);
if(!q) printf("This puzzle has no final configuration.\n");
else {
for(int i=0;i<5;i++){
for(int j=0;j<4;j++) {
printf("%c ",p[i][j]);
}
printf("%c\n",p[i][4]);
}
}
}
return 0;
}
本文深入解析了UVA227谜题的算法解决方案,重点介绍了如何处理复杂的输入和输出格式,特别是对于网格矩阵中空格的处理,以及如何通过模拟操作验证解的正确性。

被折叠的 条评论
为什么被折叠?



