- 题目链接:https://vjudge.net/problem/UVA-227
- 解题思路:略;
- AC截图:
- AC代码:
#include<stdio.h>
#include<string.h>
char s[5][7];
int x,y;int num=0;
int main(){
while(fgets(s[0],7,stdin)){
if(s[0][0]=='Z')return 0;//终止输入标志
for(int i=1;i<5;i++)
fgets(s[i],7,stdin);//使用fgets而不用scanf("%s",s[i]);
//是为了能让空格也输入进s[i],
//读取25宫格完毕
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
if(s[i][j]==' '){
x=i;y=j;break;
}//找到空格在数组中的位置
char move[20];
int i=0;
while(move[i]=getchar()){
if(move[i]=='\n')i--;//case中有间断输入
if(move[i]=='0')break;//输入结束
else i++;
}
move[i]='\0';//因为getchar()不会主动添加上字符结束标志
//所以此处手动添加;
getchar();//吃掉最后缓冲区的换行符
int x1,y1;int flag=0;
for(i=0;move[i];i++){
switch(move[i]){
case('A'):x1=x-1;y1=y;break;
case('B'):x1=x+1;y1=y;break;
case('L'):x1=x;y1=y-1;break;
case('R'):x1=x;y1=y+1;break;
default: flag=1;//标记处非法移动指令
} //找到了最终的位置x1,y1
if(x1<0||x1>4||y1<0||y1>4){
flag=1;break; //标记出超越范围的移动结果
}else{
s[x][y]=s[x1][y1];
s[x1][y1]=' '; //交换了空格和终位置的字符
x=x1;y=y1; //更新空格位置
}
}
if(num)printf("\n");
printf("Puzzle #%d:\n",++num);
if(flag)printf("This puzzle has no final configuration.\n");
else {
for(i=0;i<5;i++){
printf("%c",s[i][0]);
for(int j=1;j<5;j++)
printf(" %c",s[i][j]);//注意输出格式中有空格
printf("\n");
}
}
}
}
5. 注意点: 本题不容易AC的地方在于如何处理好字符的输入输出,其中fgets的地方用gets也可以运行,但是平台上通不过,根据本书前面的介绍,gets函数很可能已经被废除,因此也尽量不要再使用。而fgets(buf,max,fin/stdin)表示从文件fin或者标准输入流stdin中读入直到遇见’\n’(并作为最后一个字符包含进数组)或者直到max-1个字符到char buf[max]中,然后在后面自动加上‘\0’;而如果改用scanf(“%s”,s[i])则会遇到空格后自动结束该行内容的输入,造成错误。
以上代码也许还不是很好,欢迎朋友评论以交流和分享更优秀的代码。