UVa227

题目链接

https://vjudge.net/problem/UVA-227

代码

#include <iostream>
#include <vector>
#include <map>

using namespace std;

struct Point
{
    int x, y;
    Point (int x = 0, int y = 0): x(x), y(y) {}
};
typedef Point Vector;

Point operator + (const Point& A, const Point& B)
{
    return Point(A.x + B.x, A.y + B.y);
}

const int GSize = 5; // 网格的行数和列数
vector<string> grid;
Point ePos;
map<char, Vector> DIRS;

// 判断坐标是否会越界
bool valid(const Point &p)
{
    return p.x >= 0 && p.x < GSize && p.y >= 0 && p.y < GSize;
}

void printGrid()
{
    for (int i = 0; i < GSize; i++)
    {
        for (int j = 0; j < GSize; j++)
        {
            if (j) printf(" ");
            printf("%c", grid[i][j]);
        }
        printf("\n");
    }
}

bool tryMove(char cmd)
{
    if (!DIRS.count(cmd)) return false;
    Point p = ePos + DIRS[cmd]; // 移动空的格子
    if (!valid(p)) return false;
    swap(grid[p.x][p.y], grid[ePos.x][ePos.y]); // 交换空格和移动之后的空格的位置本来存储的数据
    ePos = p; // 更新 empty Position
    return true;
}

int main()
{
    int t = 1;
    string line;
    DIRS['A'] = Vector(-1, 0);
    DIRS['B'] = Vector(1, 0);
    DIRS['L'] = Vector(0, -1);
    DIRS['R'] = Vector(0, 1);

    while (true)
    {
        grid.clear();
        ePos.x = -1; ePos.y = -1;
        for (int i = 0; i < GSize; i++)
        {
            getline(cin, line);
            if (line == "Z") return 0;
            for (int j = 0; j < GSize; j++)
                if (line[j] == ' ')
                {
                    ePos.x = i;
                    ePos.y = j;
                }
            grid.push_back(line);
        }
        string moves;
        while (true)
        {
            getline(cin, line);
            bool end = *(line.rbegin()) == '0';
            if (!end)
                moves.append(line);
            else
                moves.append(line, 0, line.size() - 1); // 如果最后一个字符是 0,那么就去掉最后的 0
            if (end) break;
        }
        bool legal = true;
        for (int i = 0; i < moves.size(); i++)
        {
            if (!tryMove(moves[i]))
            {
                legal = false;
                break;
            }
        }
        if (t > 1) printf("\n");
        printf("Puzzle #%d:\n", t++);
        if (legal) printGrid();
        else printf("This puzzle has no final configuration.\n");
    }
}

按:这题涉及的 C++ 知识比较多,所以代码是直接参考陈锋的题解。

posted @ 2021-01-03 00:58  模糊计算士  阅读(99)  评论(0编辑  收藏  举报