(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; }
相关文章推荐
- 小紫书 习题 3-5(UVA 227) 谜题(Puzzle)
- UVa- 227 - Puzzle:单纯模拟 & 数据(字符数组)读入练习
- UVA - 227 Puzzle
- UVA-227 Puzzle
- UVa-227 - Puzzle
- UVa227-Puzzle
- UVa - 227 - Puzzle
- UVA - 227 Puzzle
- Uva 227 - Puzzle (数组和字符串)
- UVA - 227 Puzzle
- 习题3-5 UVa 227 Puzzle
- uva 227 Puzzle
- Puzzle,ACM/ICPC World Finals 1993,UVa227
- UVA - 227 Puzzle
- UVA - 227 Puzzle
- UVa 227 - Puzzle
- UVA227 Puzzle (字符串题)
- UVa227 Puzzle
- UVa227 Puzzle
- UVa 227 Puzzle