uva227 (我tm破防了!!!)

本人写了小十天就干这个(我太菜了那个紫皮书出这么恶心的题本身代码逻辑并不难,我也写出来了但是就算有问题我ccccccccccccccc)

首先说一下我不讲这个,因为我本身vs没有运行出来正确结果,在第二个输入中我输入的这个多出一个空格,我就算是再vj里面用别人的代码也是有问题,我就想算了不较真了,应该是vs的环境问题放在了vj这里说我超时我也就先放放吧等我过一阵子再从新检查这个代码。这篇文章就当是给我提提醒了,纱布题目我ccccccccccccccccccccccc

#include <iostream>
#include <string>
#include <cstring>
using namespace std;

char puzzle[10][10]; // 代表拼图的全局数组
int emptyX, emptyY; // 用于存储空格的位置

void fillAndFindEmpty() {
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            puzzle[i][j] = getchar();  // 获取输入字符
        }
        getchar();  // 读取每行末尾的换行符
    }
    // 查找空格的位置
    int ei = 0, ej = 0;
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            if (puzzle[i][j] == ' ') {
                ei = i;
                ej = j;
                break;
            }
        }
        if (puzzle[ei][ej] == ' ') break; // 找到空格后退出外层循环
    }
    emptyX = ei;
    emptyY = ej;
}

int main() {
    int kase = 0;
    while (true) {
        fillAndFindEmpty();
        string commands;
        getline(cin, commands);  // 读取命令字符串
        if (commands.empty()) continue; // 如果没有命令行,继续读取
        bool flag = true; // 标志变量初始化为 true
        for (char command : commands) {
            if (command == '0') {
                break;
            }
            if (command == 'Z') {
                return 0;
            }

            // 进行边界检查和移动操作
            switch (command) {
            case 'A':  // 上移
                if (emptyX > 0) {
                    char t = puzzle[emptyX - 1][emptyY];
                    puzzle[emptyX - 1][emptyY] = puzzle[emptyX][emptyY];
                    puzzle[emptyX][emptyY] = t;
                    emptyX--;
                }
                else {
                    flag = false;
                }
                break;
            case 'B':  // 下移
                if (emptyX < 4) {
                    char t = puzzle[emptyX + 1][emptyY];
                    puzzle[emptyX + 1][emptyY] = puzzle[emptyX][emptyY];
                    puzzle[emptyX][emptyY] = t;
                    emptyX++;
                }
                else {
                    flag = false;
                }
                break;
            case 'L':  // 左移
                if (emptyY > 0) {
                    char t = puzzle[emptyX][emptyY - 1];
                    puzzle[emptyX][emptyY - 1] = puzzle[emptyX][emptyY];
                    puzzle[emptyX][emptyY] = t;
                    emptyY--;
                }
                else {
                    flag = false;
                }
                break;
            case 'R':  // 右移
                if (emptyY < 4) {
                    char t = puzzle[emptyX][emptyY + 1];
                    puzzle[emptyX][emptyY + 1] = puzzle[emptyX][emptyY];
                    puzzle[emptyX][emptyY] = t;
                    emptyY++;
                }
                else {
                    flag = false;
                }
                break;
            default:
                flag = false;
                break;
            }
            if (!flag) {
                break;
            }
        }

        // 输出最终的拼图状态
        if (flag) {
            if (kase++) {
                cout << '\n';  // 输出空行以分隔不同的拼图
            }
            cout << "Puzzle #" << kase << ":\n";
            for (int i = 0; i < 5; i++) {
                for (int j = 0; j < 5; j++) {
                    if (j > 0) {
                        cout << ' ';
                    }
                    cout << puzzle[i][j];
                }
                cout << endl;
            }
        }
        else {
            cout << "This puzzle has no final configuration." << endl;
        }
       
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值