UVa227
采用的数据结构和大体流程
1.这题,因为固定是5*5的网格,我采用的方法是用一个string数组来记录输入的网格
2.因为不知道要输入多少组puzzle,所以用while(true)并在检测到Z时break出去
3.使用getline可以记录输入的空格信息
4.要注意最后输出格式
具体算法
1.输入一个puzzle,边输边检测空格,并记录空格的位置。
2.输入指令,利用rbegin反向迭代器检测指令结尾是否有结束标志0,如果没有则继续添加指令
3.在puzzle中用指令控制操作,这里写了一个switch,ABRL分别控制空格位置与上下右左交换信息
(在题解中使用的是map记录四种操作)
4.碰到不可识别指令就退出,并根据flag的值判断这题是否有解,并做输出
代码实现
#include <iostream>
#include <string>
using namespace std;
int main()
{
int i = 0, j = 0;
int posx, posy;
int flag = 0;
int sum = 1;
string matrix[5];
string input;
string moves;
while (true)
{ //输入
for (int i = 0; i < 5; i++)
{
getline(cin, input);//使用getline输入空格(cin不行)
if (input == "Z")
{
//system("pause");
return 0;
}
else
{ //检测空格
for (int k = 0; k < 5; k++)
{
if (input[k] == ' ')
{
posx = i;
posy = k;
}
}
}
matrix[i] = input;
}
//输入指令
moves.clear();
flag = 0;
while (true)
{
getline(cin, input);
bool ifEnd = *(input.rbegin()) == '0';//运用rbegin反向迭代器
if (!ifEnd)
{
moves.append(input);
}
else
{
moves.append(input, 0, input.size() - 1);
}
if (ifEnd)
break;
}
//操作
for (int j = 0; j < moves.size(); j++)
{
//cout << posx << " " << posy << endl;
switch (moves[j])
{
case 'A':
if (posx == 0)
{
flag = 1;
}
else
{
swap(matrix[posx][posy],matrix[posx - 1][posy]);
posx = posx - 1;
}
break;
case 'B':
if (posx == 4)
{
flag = 1;
}
else
{
swap(matrix[posx][posy], matrix[posx + 1][posy]);
posx = posx + 1;
}
break;
case 'R':
if (posy == 4)
{
flag = 1;
}
else
{
swap(matrix[posx][posy], matrix[posx][posy+1]);
posy = posy + 1;
}
break;
case 'L':
if (posy == 0)
{
flag = 1;
}
else
{
swap(matrix[posx][posy], matrix[posx][posy-1]);
posy = posy - 1;
}
break;
default:
flag = 1;
break;
}
if (flag == 1)
break;
}
if (sum > 1)
cout << endl;
cout << "Puzzle #" << sum++<< ":" << endl;
if (flag == 0)
{
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
if (j)
cout << " ";
cout << matrix[i][j];
}
cout << endl;
}
}
else
{
cout << "This puzzle has no final configuration." << endl;
}
}
//system("pause");
return 0;
}