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;
}
posted @ 2026-06-06 09:56  qiannong  阅读(16)  评论(0)    收藏  举报