zoukankan      html  css  js  c++  java
  • 1443 马的遍历

    难度:普及/提高-

    题目类型:BFS

    提交次数:5

    涉及知识:BFS

    题目描述

    有一个n*m的棋盘(1<n,m<=200),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步

    输入输出格式

    输入格式:

    一行四个数据,棋盘的大小和马的坐标

    输出格式:

    一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)

    代码:

    #include<iostream>
    #include<queue>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    int n, m, sx, sy;
    int d[2][8] = {{1, 1, -1, -1, 2, 2, -2, -2}, {2, -2, 2, -2, 1, -1, 1, -1}};
    int a[2001][2001];
    int visited[2001][2001];
    struct pos{
        int x, y, step;
        pos(int xx, int yy, int s): x(xx), y(yy), step(s){}
    };
    bool check(int x, int y){
        if(x>=1&&x<=n&&y>=1&&y<=m&&visited[x][y]==-1)
            return true;
        return false;
    }
    queue<pos>q;
    int main(){
        cin>>n>>m>>sx>>sy;
        memset(visited, -1, sizeof(visited));
        int i, j;
        q.push(pos(sx, sy, 0));
        visited[sx][sy] = 0;
        while(!q.empty()){
            pos p = q.front();
            for(i = 0; i < 8; i++){
                if(check(p.x+d[0][i], p.y+d[1][i])){
                    q.push(pos(p.x+d[0][i], p.y+d[1][i], p.step+1));
                    visited[p.x+d[0][i]][p.y+d[1][i]] = p.step+1;
                }
            }
            q.pop();
        }
        for(i = 1; i <= n; i++){
            for(j = 1; j <= m; j++)
                printf("%-5d", visited[i][j]);
            cout<<endl;
        }
        return 0;
    }

    备注:

    赤裸裸的BFS水题。但我居然又卡了半天。。本来是为了简化代码用了方向数组,结果visited加到了pop前 循环后,然后就各种超时,想了半天也没想明白。然而神奇的是当我刚开始给老师发微信的时候,看到了visited那行,发现不太对。。应该加到队列里的时候就做标记的啊。。不然又会拓展到它自己,不出问题才怪呢。到这里BFS告一段落了,打卡!

  • 相关阅读:
    构建之法阶段小记七
    构建之法阶段小记六
    构建之法阶段小记五
    构建之法阶段小记四
    构建之法阶段小记三
    短学期知识总结(二)
    短学期知识总结(一)
    《构建之法》第八章自习感想与知识点
    第15组构建之法团队心得
    《构建之法》第七章自习感想与知识点
  • 原文地址:https://www.cnblogs.com/fangziyuan/p/5879345.html
Copyright © 2011-2022 走看看