这题太能卡人了,都是输入输出卡的。
1.输入的5X5矩阵中,有时一行最后有多个空格和回车
2.输出格式中,每两个输出结果之间间隔一个空行,但是最后一个结果之后没有空行。
3.有时到第四位元素,直接不按空格,直接换行了。
其实思路很简单,先判断是否运动越界,如果是的话就输出无答案,如果没越界,就依次将空格和目标位置元素相互交换。
下面是AC代码,就是把这些小BUG修修补补改出来的,抛砖引玉吧。
#include <bits/stdc++.h>
#define N 7
#define M_N 100005
using namespace std;
char ch[N][N],dic[M_N];
pair<int,int> now;
bool scf(),fg;
int main() {
//freopen("input.txt","ra",stdin);
//freopen("output.txt","wa",stdout);
int dd=0;
while (scf()) {
char c;
int cnt=0;
while ((c=getchar())&&c!=‘0‘)
dic[cnt++]=c;
getchar();
dic[cnt]=‘\0‘;
bool flag=true;
int len=strlen(dic);
for (int i=0;i<len;i++) {
if (!isalpha(dic[i])) continue;
int ti=now.first,tj=now.second;
switch(dic[i]) {
case ‘A‘: ti--;break;
case ‘B‘: ti++;break;
case ‘L‘: tj--;break;
case ‘R‘: tj++;break;
default: {
flag=false;
goto ed;
}
}
if (ti<0||ti>4||tj<0||tj>4) {
flag=false;
break;
}
swap(ch[now.first][now.second],ch[ti][tj]);
now.first=ti,now.second=tj;
}
ed:;
printf("Puzzle #%d:\n",++dd);
if (flag) {
for (int i=0;i<5;i++) {
printf("%c",ch[i][0]);
for (int j=1;j<5;j++)
printf(" %c",ch[i][j]);
printf("\n");
}
}
else printf("This puzzle has no final configuration.\n");
}
return 0;
}
bool scf() {
fill(ch[0],ch[0]+N*N,‘\0‘);
for (int i=0;i<5;i++) {
gets(ch[i]);
if (strlen(ch[i])==1) return false;
for (int j=0;j<5;j++) {
if (ch[i][j]==‘\n‘) ch[i][j]=‘ ‘;
if (ch[i][j]==‘ ‘)
now.first=i,now.second=j;
}
ch[i][5]=‘\0‘;
}
if (fg) printf("\n");
fg=true;
return true;
}
原文地址:https://www.cnblogs.com/yichuan-sun/p/9641538.html
时间: 2024-09-30 09:55:28