这道题是道水题,至于为什么我做了这么长时间,完全是因为我自己能力的不足。从昨天下午四点做到现在才A出来,改写了无数次。
这道题的问题在于:你不能一边读指令一边走。你一边读指令一边走的话应该会把一些指令留在缓冲区中,导致一系列问题,我在昨晚就注意到了这个问题,今早在重写这个题时,将数种清空cin缓存的方法都堆上了,但是还是不能解决这个问题。希望各位看官能够帮助我解决这个问题
错误代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
using namespace std;
int main()
{
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
// ios_base::sync_with_stdio(false);
string Square[6];
char feet;
int x, y, t = 0;
bool flag;
while(getline(cin, Square[0])&& Square[0][0] != 'Z')
{
//cout << Square[0] << endl;
//if(Square[0] == "Z"){break;}
for(int i = 1; i < 5; i++)
{
getline(cin, Square[i]);
}
//cout <<"++"<< endl;
for(int i = 0; i < 5; i++)
{
//cout << i << endl;
string mid = Square[i];
int len = mid.size();
//cout << len << endl;
if(len == 4)
{
x = i, y = 4;
break;
}
for(int j = 0; j < len; j++)
{
if(Square[i][j] == ' ')
{
x = i, y = j;
break;
}
}
}
//cout << x << " " << y << endl;
flag = true;
while(cin >> feet&& feet != '0')
{
if(feet == 'A')
{
if(x - 1 < 0)
{
flag = false;
break;
}
else
{
Square[x][y] = Square[x - 1][y];
Square[--x][y] = ' ';
}
}
else if(feet == 'B')
{
if(x + 1 > 4)
{
flag = false;
break;
}
else
{
Square[x][y] = Square[x + 1][y];
Square[++x][y] = ' ';
}
}
else if(feet == 'R')
{
if(y + 1 > 4)
{
flag = false;
break;
}
else
{
Square[x][y] = Square[x][y+1];
Square[x][++y] = ' ';
}
}
else
{
if(y - 1 < 0)
{
flag = false;
break;
}
else
{
Square[x][y] = Square[x][y-1];
Square[x][--y] = ' ';
}
}
}
getchar();
cout << "Puzzle #" << ++t << ":\n";
if(flag)
{
for(int i = 0; i < 5; i++)
{
for(int j = 0; j < 5; j++)
{
printf("%c", Square[i][j]);
if(j != 4)
{
printf(" ");
}
}
printf("\n");
}
}
else
{
cout << "This puzzle has no final configuration.\n";
}
cout << "\n";
}
//fclose(stdin);
//fclose(stdout);
return 0;
}
正确代码:
思路:读入矩阵,找到空格位置,用一个容器储存指令,然后按照指令进行操作得出结果。注意指令让你出界和不存在的指令。
代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
#include <map>
using namespace std;
struct next_f
{
int x, y;
};
map<char, next_f> base;
void Pre()
{
base.clear();
next_f mid;
mid.x = -1, mid.y = 0;
base['A'] = mid;
mid.x = 1, mid.y = 0;
base['B'] = mid;
mid.x = 0, mid.y = -1;
base['L'] = mid;
mid.x = 0, mid.y = 1;
base['R'] = mid;
}
int main()
{
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
char square[5][5];
int t = 0, x, y;
bool flag;
Pre();
while(gets(square[0])&& square[0][0] != 'Z')
{
if(t)
{
printf("\n");
}
for(int i = 1; i < 5; i++)
{
gets(square[i]);
}
for(int i = 0; i < 5; i++)
{
for(int j = 0; j < 5; j++)
{
if(j == 4&& square[i][j] == 0)
{
x = i, y = j;
break;
}
if(square[i][j] == ' ')
{
x = i, y = j;
break;
}
}
}
//char feet;
flag = true;
string feet;
getline(cin, feet);
int len = feet.size();
while(feet[len - 1] != '0')
{
string k;
getline(cin, k);
feet += k;
len = feet.size();
}
int j = 0;
//cout << x << " " << y <<endl;
printf("Puzzle #%d:\n", ++t);
while(feet[j] != '0')
{
char o = feet[j];
int xx, yy;
xx = x + base[o].x;
yy = y + base[o].y;
//cout << base[o].x << " " << base[o].y <<endl;
//cout << xx << " " << yy <<endl;
if(o !='A'&& o != 'B'&& o != 'R'&& o!= 'L')
{
flag = false;
break;
}
if(xx < 0|| yy < 0|| xx > 4|| yy > 4)
{
flag = false;
break;
}
else
{
square[x][y] = square[xx][yy];
square[xx][yy] = ' ';
x = xx, y = yy;
}
j++;
}
if(flag)
{
for(int i = 0; i < 5; i++)
{
for(int j = 0; j < 5; j++)
{
printf("%c", square[i][j]);
if(j != 4)
{
printf(" ");
}
}
printf("\n");
}
}
else
{
printf("This puzzle has no final configuration.\n");
}
}
fclose(stdin);
fclose(stdout);
return 0;
}