OD跳马

#include<iostream>
#include<vector>
#include<string>
#include<queue>
#include<climits>

using namespace std;

vector<vector<int>> checknum = { {1,2},{1,-2},{2,1},{2,-1},{-1,2},{-1,-2},{-2,-1},{-2,1} };

void bfs(vector<vector<int>>&amp; board, vector<vector<int>>&amp; numofhourse, vector<vector<int>>&amp; stepnum,int n,int m){
    int maxstep = board[n][m];
    int step = 0;
    queue<pair<int, int>> que;
    que.push({ n,m });
    vector<vector<bool>> checkboard(board.size(), vector<bool>(board[0].size(), 0));
    while (!que.empty() &amp;&amp; step < maxstep) {
        int size = que.size();
        for (int i = 0; i < size; i++) {
            int x = que.front().first;
            int y = que.front().second;
            que.pop();
            stepnum[x][y] += step;
            numofhourse[x][y]++;
            checkboard[x][y] = 1;
            for (int j = 0; j < checknum.size(); j++) {
                int nx = x + checknum[j][0];
                int ny = y + checknum[j][1];
                if (nx >= 0 &amp;&amp; nx < board.size() &amp;&amp; ny >= 0 &amp;&amp; ny < board[0].size() &amp;&amp; checkboard[nx][ny] == 0) {
                    checkboard[nx][ny] = 1;
                    que.push({ nx,ny });
                }
            }
        }
        step++;
    }

}

int main() {
    int row, col;
    cin >> row >> col;
    vector<vector<int>> board(row, vector<int>(col, 0));
    vector<vector<int>> numofhourse = board;
    vector<vector<int>> stepnum(row, vector<int>(col, 0));
    int counthourse = 0;
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            string temp;
            cin >> temp;
            if (temp != &quot;.&quot;) {
                board[i][j] = stoi(temp);
                counthourse++;
            }
        }
    }

    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            if (board[i][j] > 0) {
                bfs(board, numofhourse, stepnum, i, j);
            }
        }
    }

    int minstep = INT_MAX;
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            if (numofhourse[i][j] == counthourse) {
                if (stepnum[i][j] < minstep) {
                    minstep = stepnum[i][j];
                }
            }
        }
    }
    if (minstep == INT_MAX) {
        cout << &quot;0&quot;;
    }
    else {
        cout << minstep;
    }
    return 0;
}
全部评论
bfs里面分别是 每个马初始化一个bool数组来计算该马走过的 ;一个全局计数二维数组来计算能到达这个点的马的数量 ;一个全局二维数组来累计计算所有马到达这个点的步数 最后记录马的数量为所有数量的点的步数为结果,如果马的数量记录小于总的马数就说明没有点
点赞 回复 分享
发布于 2024-09-06 12:46 重庆

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务