洛谷 P1443 马的遍历

题目描述

有一个 n×m 的棋盘,在某个点 (x,y) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。

输入格式

输入只有一行四个整数,分别为 n,m,x,y。

输出格式

一个 n×m 的矩阵,代表马到达某个点最少要走几步(不能到达则输出 −1)。

输入输出样例

输入 #1复制

复制代码
3 3 1 1

输出 #1复制

复制代码
0 3 2    
3 -1 1    
2 1 4    

说明/提示

数据规模与约定

对于全部的测试点,保证 1≤x≤n≤400,1≤y≤m≤400。

2022 年 8 月之后,本题去除了对输出保留场宽的要求。为了与之兼容,本题的输出以空格或者合理的场宽分割每个整数都将判作正确。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=410;
int n,m,x,y;
int dist[N][N];
typedef pair<int,int> PII;
int dx[]={1,2,2,1,-1,-2,-1,-2};
int dy[]={2,1,-1,-2,-2,-1,2,1};
void bfs()
{
    memset(dist,-1,sizeof dist);
    queue<PII> q;
    dist[x][y]=0;
    q.push({x,y});

    while(q.size())
    {
        auto t=q.front();
        q.pop();
        int z=t.first,k=t.second;
        for(int i=0;i<8;i++)
        {
            int x=z+dx[i];
            int y=k+dy[i];
            if(x<1||x>n||y<1||y>m)
            continue;
            if(dist[x][y]!=-1)
            continue;
            dist[x][y]=dist[z][k]+1;
            q.push({x,y});
        }
    }
}
int main()
{
    cin>>n>>m>>x>>y;
    bfs();
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cout<<dist[i][j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}
相关推荐
lxh01131 分钟前
缺失的第一个正数
数据结构·算法
啊阿狸不会拉杆2 分钟前
《数字图像处理》第 12 章 - 图像模式分类
图像处理·人工智能·算法·机器学习·计算机视觉·分类·数据挖掘
杨福瑞5 分钟前
数据结构:⼆叉树(1)
c语言·数据结构
LYFlied8 分钟前
【每日算法】LeetCode 763. 划分字母区间(贪心算法)
前端·算法·leetcode·面试·贪心算法
zore_c8 分钟前
【数据结构】二叉树初阶——超详解!!!(包含二叉树的实现)
c语言·开发语言·数据结构·经验分享·笔记·算法·链表
尋有緣9 分钟前
力扣1225-报告系统状态的连续日期
数据库·sql·算法·leetcode·oracle
代码游侠14 分钟前
学习笔记——网络基础
linux·c语言·网络·笔记·学习·算法
热爱生活的五柒15 分钟前
深度聚类(Deep Clustering)与度量学习(Metric Learning)的共同点和不同点
人工智能·算法·机器学习
LYFlied10 小时前
【每日算法】LeetCode 153. 寻找旋转排序数组中的最小值
数据结构·算法·leetcode·面试·职场和发展
唐装鼠10 小时前
rust自动调用Deref(deepseek)
开发语言·算法·rust