您的位置:首页 > 其它

谜题 (Puzzle, ACM/ICPC World Finals 1993, UVa227)

2017-01-18 20:59 911 查看
有一个5*5的网格,其中恰好有一个格子是空的,其他格子各有一个字母。一共有4种指令:A, B, L, R,分别表示把空格上、下、左、右的相邻字母移到空格中。输入初始网格和指令序列(以数字0结束),输出指令执行完毕后的网格。如果有非法指令,应输出“This puzzle has no final configuration.”

例如,图3-5中执行ARRBBL0后,效果如图所示。



没有太大的难度,就是麻烦点,注意输出每行末不能有空格,循环输入为了方便我没有写上,毕竟懂得思路就行了.

#include <iostream>

using namespace std;

void set_mn(char &chr, int &m, int &n)
{
if (chr == 'A')
m--;
if (chr == 'B')
m++;
if (chr == 'L')
n--;
if (chr == 'R')
n++;
}

int main()
{
char mitrix[5][5] =
{ 'T', 'R', 'G', 'S', 'J', 'X', 'D', 'O', 'K', 'I', 'M', ' ', 'V',
'L', 'N', 'W', 'P', 'A', 'B', 'E', 'U', 'Q', 'H', 'C', 'F' };
char order[100];
int k = 0, i, j, m = 2, n = 1;
cin >> order;

while (order[k] != '\0' && order[k] != '0')
{
i = m;
j = n;
set_mn(order[k], m, n);
if (m < 0 || m >= 5 || n < 0 || m >= 5)
{
cout << "This puzzle has no final configuration." << endl;
return 0;
}

mitrix[i][j] = mitrix[m]
;
mitrix[m]
= ' ';

k++;
}

for (int i = 0; i < 5; i++)
{
int space = 0;
for (int j = 0; j < 5; j++)
{
if (space)
{
cout<<" ";  //输出一行后不能有空格
}
space = 1;
cout << mitrix[i][j];
}
cout << endl;
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uva ACM 谜题