题解 | 象棋马走步问题

象棋马走步问题

https://www.nowcoder.com/practice/dd32e53fb6ae43399a118f5274c84c8e

#include <algorithm>
#include <bits/stdc++.h>
#include <iterator>
#include <vector>
using namespace std;

int mov[8][2] {{1, -2}, {1, 2}, {-1, -2}, {-1, 2},
    {2, 1}, {2, -1}, {-2, 1}, {-2, -1}
};

void dfs(vector<vector<int>>& res, vector<int>& tmp, vector<vector<int>>& pre,
         int point, int st) {
    tmp.push_back(point);
    if (point == st) {
        vector<int> validtmp(tmp);
        reverse(validtmp.begin(), validtmp.end());
        res.push_back(validtmp);
    } else {
        for (int i = 0; i < pre[point].size(); i++) {
            dfs(res, tmp, pre, pre[point][i], st);
        }
    }
    tmp.pop_back();
}

int main() {
    int n;
    cin >> n;
    int graph[8][8] {0};
    for (int i = 0; i < n; i++) {
        int x;
        cin >> x;
        graph[x / 8][x % 8] = 1;
    }
    int st, en;
    cin >> st >> en;
    int stx = st / 8, sty = st % 8, enx = en / 8, eny = en % 8;
    if (graph[stx][sty] == 1 || graph[enx][eny] == 1) {
        cout << "UNREACHED" << endl;
        return 0;
    }

    int dist[64];
    memset(dist, -1, sizeof(dist));
    vector<vector<int>> pre(64);
    queue<pair<int, int>> q;
    dist[st] = 0;
    q.push({stx, sty});
    while (!q.empty()) {
        int ox = q.front().first, oy = q.front().second;
        int op = ox * 8 + oy;
        q.pop();
        for (int i = 0; i < 8; i++) {
            int nx = ox + mov[i][0], ny = oy + mov[i][1];
            if (nx < 0 || nx >= 8 || ny < 0 || ny >= 8) continue;
            if (graph[nx][ny] != 1) {
                int p = nx * 8 + ny;
                if (dist[p] == -1) {
                    dist[p] = dist[op] + 1;
                    pre[p].push_back(op);
                    q.push({nx, ny});
                } else {
                    if (dist[p] == dist[op] + 1)
                        pre[p].push_back(op);
                }

            }
        }
    }
    if (dist[en] == -1) {
        cout << "UNREACHED" << endl;
        return 0;
    }

    vector<vector<int>> res;
    vector<int> tmp;
    dfs(res, tmp, pre, en, st);

    sort(res.begin(), res.end());
    for (int i = 0; i < res.size(); i++) {
        for (int j = 0; j < res[i].size(); j++) {
            if (j != 0) cout << ' ';
            cout << res[i][j];
        }
        cout << endl;
    }
}

bfs + dfs

全部评论

相关推荐

找工作勤劳小蜜蜂:矛盾是没有实习,就是没实战经验,公司不想要,公司不要,你就没有实习,你就进入死循环,另外你的项目不是社会现在有大量岗位存在行业用的,云存储人员早就饱和。
点赞 评论 收藏
分享
02-28 01:18
已编辑
南昌大学 后端工程师
黑皮白袜臭脚体育生:把开源经历放个人项目上边应该更好,就像大部分人都把实习经历放个人项目上边
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务