谜题
有一个5*5的网格,其中恰好有一个格子是空的,其他格子各有一个字母。一共有4种指令:A, B, L, R,分别表示把空格上、下、左、右的相邻字母移到空格中。输入初始网格和指令序列(以数字0结束),输出指令执行完毕后的网格。如果有非法指令,应输出“This puzzle has no final configuration.”。
#include "pch.h"
#include <iostream>
using namespace std;
void swap(char &x, char &y)
{
char temp;
temp = x;
x = y;
y = temp;
}
int main()
{
int r = 0, c = 0, i = 0, j = 0;
bool islegal = true;
char grid[6][6];
char s[105];
memset(grid, '\0', sizeof(grid));
memset(s, '\0', sizeof(s));
for (int m = 0; m < 5; m++)//输入初始网格(注意结束不要输入换行)
{
for (int n = 0; n < 5; n++)
{
grid[m][n] = getchar();
}
}
for (int m = 0; m < 5; m++)//查找网格中的空格并将空格所在行和列索引分别保存在r和c中
{
for (int n = 0; n < 5; n++)
{
if (grid[m][n] == ' ')
{
r = m;//空格的行索引
c = n;//空格的列索引
break;
}
}
if (r != 0 && c != 0)
{
break;
}
}
for (i = 0; (s[i] = getchar()) != '0'; i++);//循环输入指令序列(注意开头不要输入换行)
for (j = 0; j <= i; j++)//执行移位
{
if (s[j] == '0')//判断指令是否执行完毕
{
break;
}
else if (s[j] == 'A' && r != 0)//如果指令为‘A’,判断空格所在位置是否已经是上边界
{
swap(grid[r][c], grid[r - 1][c]);
r = r - 1;
}
else if (s[j] == 'B' && r != 4)//如果指令为‘B’,判断空格所在位置是否已经是下边界
{
swap(grid[r][c], grid[r + 1][c]);
r = r + 1;
}
else if (s[j] == 'L' && c != 0)//如果指令为‘L’,判断空格所在位置是否已经是左边界
{
swap(grid[r][c], grid[r][c - 1]);
c = c - 1;
}
else if (s[j] == 'R' && c != 4)//如果指令为‘R’,判断空格所在位置是否已经是右边界
{
swap(grid[r][c], grid[r][c + 1]);
c = c + 1;
}
else
{
cout << "This puzzle has no final configuration.";//指令不合法,输出提示,跳出循环并置islegal标记为false
islegal = false;
break;
}
}
if (islegal == true)//如果指令合法则输出移位之后的网格
{
for (int m = 0; m < 5; m++)
{
for (int n = 0; n < 5; n++)
{
cout << grid[m][n] << " ";
}
cout << endl;
}
}
return 0;
}