UVa227puzzle
这个题我写的不对,照刘汝佳的写了ac过了,但是问了一下AI思路不太一样
AI给我一个建议:
从“菜鸟”到“专家”的解题境界
这个过程的背后,反映的是解题水平的四个层层递进的境界:
· 菜鸟:复制粘贴别人的代码。
· 新手:自己写出了代码,能AC,但自己感觉有点磕磕绊绊。
· 高手:不仅自己写出了代码,还能清晰地讲述“我为什么这么写”,“我预测的陷阱在哪里”。
· 专家:能反过来为一道题设计出巧妙的陷阱,比如故意在输入时添加难以察觉的空格来考验选手。
只要坚持这样思考,从新手迈向高手是早晚的事!
点击查看代码
// UVA 227 - Puzzle
// 解法:模拟 + 方向数组 + 严格处理输入输出
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char puzzle[5][5]; // 5x5 网格
int zx, zy; // 空格(空白块)的位置 (行,列)
int kase = 0; // 记录第几个 puzzle,用于输出空行
// 方向映射: A=上, B=下, L=左, R=右
const int dx[128] = {0}; // 直接用字符作为索引
const int dy[128] = {0};
// 实际初始化放在 main 里 (因为 C++ 不支持非 const 的数组初始化列表?可以用下面的方式)
void init_dir() {
// 利用 ASCII 码,给字符 'A','B','L','R' 赋值移动偏移
dx['A'] = -1; dy['A'] = 0;
dx['B'] = 1; dy['B'] = 0;
dx['L'] = 0; dy['L'] = -1;
dx['R'] = 0; dy['R'] = 1;
}
int main() {
init_dir();
while (true) {
// ---------- 输入 5x5 网格 ----------
// 读第 0 行
string line;
getline(cin, line);
if (line == "Z") break; // 结束标志
// 将第一行复制到 puzzle[0]
for (int j = 0; j < 5; ++j) {
puzzle[0][j] = line[j];
if (line[j] == ' ') { zx = 0; zy = j; }
}
// 读接下来的 4 行
for (int i = 1; i < 5; ++i) {
getline(cin, line);
// 题目保证每行正好 5 个字符(可能有空格)
for (int j = 0; j < 5; ++j) {
puzzle[i][j] = line[j];
if (line[j] == ' ') { zx = i; zy = j; }
}
}
// ---------- 读指令序列(可能跨多行,以 '0' 结束)----------
string moves = "";
string cmd;
while (true) {
getline(cin, cmd);
size_t pos = cmd.find('0');
if (pos != string::npos) {
moves += cmd.substr(0, pos); // 去掉 '0' 及其之后的内容
break;
} else {
moves += cmd;
}
}
// ---------- 执行移动 ----------
bool ok = true;
for (char ch : moves) {
int nx = zx + dx[ch];
int ny = zy + dy[ch];
if (nx < 0 || nx >= 5 || ny < 0 || ny >= 5) {
ok = false;
break;
}
// 交换空格和相邻格子的字符
swap(puzzle[zx][zy], puzzle[nx][ny]);
zx = nx; zy = ny;
}
// ---------- 输出结果 ----------
if (kase > 0) cout << endl; // 两个 puzzle 之间空行
cout << "Puzzle #" << ++kase << ":\n";
if (!ok) {
cout << "This puzzle has no final configuration.\n";
} else {
for (int i = 0; i < 5; ++i) {
for (int j = 0; j < 5; ++j) {
if (j) cout << ' ';
cout << puzzle[i][j];
}
cout << '\n';
}
}
}
return 0;
}
本文来自博客园,作者:qiannong,转载请注明原文链接:https://www.cnblogs.com/qiannong/p/20339441

浙公网安备 33010602011771号