这个题让我和题目一样--好迷惑,以为是一道水题,寻思做完了就睡觉
然后做到现在,前后做了两个小时,由于UVa编译器只能用c++11导致gets()废掉
网上的代码都是gets,用getline写遇到了很多困难,于是尝试用getchar写
排除了很多可能出现的问题,终于敲过了样例,此时过去了一个小时。。。
第二个小时在找PE的错误,这个错误真不想说啥了,恶心,空白行出现的位置其实差不多啊。。。
感觉不是我的错,因为之前所有类似格式都是这么写的,这道题居然,,,卡我数据???吐了
字符串处理本来就不是强项,应该多加练习!!!
唉唉睡觉去了(继续练练字符串!
来之不易的AC代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<cmath>
#include<time.h>
using namespace std;
int main()
{
char a[7][7];
int cas = 1;
while(1)
{
int p, q;
char c;
if(cas != 1)
getchar();
for(int i = 0; i < 5; i ++)
for(int j = 0; j <= 5; j ++)
{
c = getchar();
if(j == 5) continue;
if(c == ' ')
{
p = i;
q = j;
}
a[i][j] = c;
}
// getchar();
if(a[0][0] == 'Z') break;
// for(int i = 0; i < 5; i ++)
// {
// for(int j = 0; j < 5; j ++)
// {
// cout<<a[i][j];
// if(j != 4)
// cout<<' ';
// }
// cout<<endl;
// }
char ss[1005];
int cnt = 0;
while(1)
{
c = getchar();
if(c == '0') break;
if(c == '\n')continue;
if(c == ' ')continue;
else ss[cnt ++] = c;
}
ss[cnt] = '\0';
// for(int i = 0; i < strlen(ss); i ++)
// cout<<ss[i];
// cout<<endl;
// cout<<p<<' '<<q<<endl;
bool flag = 1;
for(int i = 0; i < strlen(ss); i ++)
{
if(ss[i] == 'A')
{
if(p - 1 < 0) {
flag = 0;
break;
}
swap(a[p][q], a[p-1][q]);
// a[p][q] = a[p-1][q];
// a[p-1][q] = ' ';
p--;
}
if(ss[i] == 'B')
{
if(p + 1 >= 5) {
flag = 0;
break;
}
swap(a[p][q], a[p+1][q]);
// a[p][q] = a[p+1][q];
// a[p+1][q] = ' ';
p++;
}
if(ss[i] == 'L')
{
if(q - 1 < 0) {
flag = 0;
break;
}
swap(a[p][q], a[p][q-1]);
// a[p][q] = a[p][q - 1];
// a[p][q-1] = ' ';
q--;
}
if(ss[i] == 'R')
{
if(q + 1 >= 5) {
flag = 0;
break;
}
swap(a[p][q], a[p][q+1]);
// a[p][q] = a[p][q+1];
// a[p][q+1] = ' ';
q++;
}
}
if(cas != 1)cout<<endl;
printf("Puzzle #%d:\n",cas++);
//cout<<flag<<endl;
if(! flag)
{
printf("This puzzle has no final configuration.\n");
continue;
}
for(int i = 0; i < 5; i ++)
{
for(int j = 0; j < 5; j ++)
{
cout<<a[i][j];
if(j != 4)
cout<<' ';
}
cout<<endl;
}
//cout<<endl;
}
return 0;
}