您的位置:首页 > 其它

(UVA)227 - Puzzle

2017-03-03 14:04 288 查看








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

分析:这题格式需要尤其注意,以及注意非法指令的判断。

我的代码没有下面这个代码优秀,贴出一个思路非常好的代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

const char inst[] = "ABLR";
const int dir[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};

int main(void)
{
int t = 0;
char s[5][6];
char c;
while ((s[0][0] = getchar()) != 'Z') {
int bi = 0, bj = 0;
for (int i = 0; i < 5; i ++) {
for (int j = 0; j < 5; j ++) {
if (!i && !j) continue;
s[i][j] = getchar();
if (s[i][j] == ' ') {bi = i, bj = j;}
}
getchar();
}
bool legal = true;
while ((c = getchar()) != '0') {
if (legal == false || c == '\n') continue;
int k;
for (k = 0; k < 4; k ++) {
if (c == inst[k]) break;
}
if (k == 4)
legal = false;
else {
int ni = bi+dir[k][0], nj = bj+dir[k][1];
if (0 <= ni && ni < 5 && 0 <= nj && nj < 5) {
swap(s[bi][bj], s[ni][nj]);
bi = ni, bj = nj;
} else
legal = false;
}
}
if (++t > 1) printf("\n");
printf("Puzzle #%d:\n", t);
if (legal == false)
printf("This puzzle has no final configuration.\n");
else {
for (int i = 0; i < 5; i ++) {
for (int j = 0; j < 5; j ++) {
printf("%c%c", s[i][j], j == 4 ? '\n' : ' ');
}
}
}
getchar();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: