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告一段落了,打卡!

时间: 2024-10-03 04:57:13

1443 马的遍历的相关文章

马的遍历问题

题意例如以下: 马的遍历问题.设计程序完毕例如以下要求: 在中国象棋棋盘上,对任一位置上放置的一个"马". 均能选择一个合适的路线,使得该棋子能按象棋的规则 不反复地走过棋盘上的每一位置. 思路:这是一个DFS搜索,然后没有使用另外的数组来标记某一位置是否已经被走过,而是直接使用存步数的数组num[][]来作为标记数组! 然后我使用了两个数组作为方向坐标,以便能让马移动,同一时候也能记录马所在位置的坐标!(马是能够从8个移动方向中选择的!) 代码还是非常好理解的! 至于棋盘的规格能够自

P1443 马的遍历

P1443 马的遍历 题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入输出格式 输入格式: 一行四个数据,棋盘的大小和马的坐标 输出格式: 一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1) 输入输出样例 输入样例#1: 3 3 1 1 输出样例#1: 0 3 2 3 -1 1 2 1 4 #include<iostream> #include<cstdio>

马的遍历

题目链接 首先,这是一道水题.(虽然我提交了四次才A掉) 思路是很简单的.马的遍历,经典中的经典,一想就是搜索.但流传较广的是DFS,第一直觉也是DFS.可是,一看题,求马到各点的最短路,是求最优解,且是各个点,自然想到了BFS. BFS的简单思路,将矩阵每个点 原文地址:https://www.cnblogs.com/qing1/p/11066106.html

洛谷——P1443 马的遍历

https://www.luogu.org/problem/show?pid=1443#sub 题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入输出格式 输入格式: 一行四个数据,棋盘的大小和马的坐标 输出格式: 一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1) 输入输出样例 输入样例#1: 3 3 1 1 输出样例#1: 0 3 2 3 -1 1 2 1 4 1 #include

洛谷 P1443 马的遍历

题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入输出格式 输入格式: 一行四个数据,棋盘的大小和马的坐标 输出格式: 一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1) 输入输出样例 输入样例#1: 3 3 1 1 输出样例#1: 0 3 2 3 -1 1 2 1 4 代碼實現: #include<cstdio>#include<iostream>using

马的遍历——搜索与回溯

题目描述 Description 中国象棋半张棋盘如图所示.马自左下角往右上角跳.今规定只许往右跳,不许往左跳.比如图4(a)中所示为一种跳行路线,并将所经路线打印出来. 输入输出格式 Input/output 输入格式:无输出格式: 第一行:一个整数total表示第几种跳法 第二行:0,0-->2,1-->3,3-->1,4-->3,5-->2,7-->4,8 输入输出样例 Sample input/output 样例测试点#1 输入样例: 无 输出样例: 1 0,0

Ka的回溯编程练习 Part5|跳马,又名马的遍历2

1 #include <stdio.h> 2 int TheEarthLand[6][6]={0}; 3 int HowToGoX[]={0,1,2,2,1,-1,-2,-2,-1}; 4 int HowToGoY[]={0,-2,-1,1,2,2,1,-1,-2}; 5 int total=0; 6 void op() 7 { 8 total++; 9 printf("<Way%d>:\n",total); 10 int i,j; 11 for(i=1;i&l

广搜模板题马的遍历题解

题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入格式 一行四个数据,棋盘的大小和马的坐标 输出格式 一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1) 本题思路是利用队列存储,将当前点可到达的下一个点入队以保证步数最小 #include<bits/stdc++.h> using namespace std; int n; int a,b,c,d,k[1001][1001]

马的遍历x

//AC自动机x#include<iostream>#include<cstdio>#include<iostream>#include<cstdlib>#include<cstring>#include<string>#include<cmath>using namespace std;int a[10][10],t=0;int h[4]= {1,2,2,1};//横坐标 int z[4]= {2,1,-1,-2};//