• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

isomer

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

P1443 马的遍历

马的遍历

题目描述

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

输入格式

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

输出格式

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

样例 #1

样例输入 #1

3 3 1 1

样例输出 #1

0    3    2    
3    -1   1    
2    1    4

提示

数据规模与约定

对于全部的测试点,保证 \(1 \leq x \leq n \leq 400\),\(1 \leq y \leq m \leq 400\)。

本题考查一个最短路问题,在两种搜索中我选择bfs进行解决(当然bfs也是最短路的问题一种解决方案)

```plaintext
#include<bits/stdc++.h>
using namespace std;

const int N=500;


const int dx[]={1,1,-1,-1,2,2,-2,-2};
const int dy[]={2,-2,2,-2,1,-1,1,-1};
int n,m,x,y;
int ans[N][N];
bool vis[N][N];
queue<pair<int,int> >q;
void bfs(int x,int y)
{
    q.push(make_pair(x,y));
    vis[x][y]=1;
    ans[x][y]=0;
    while(q.size()){
        int xx=q.front().first,yy=q.front().second;
        q.pop();
        for(int i=0;i<8;i++){
            int a=xx+dx[i],b=yy+dy[i];
            if(a<1||a>n||b<1||b>m||vis[a][b])continue;
            q.push(make_pair(a,b));
            vis[a][b]=1;
            ans[a][b]=ans[xx][yy]+1;
        }
    }
}


int main()
{
    cin>>n>>m>>x>>y;
    memset(vis,0,sizeof vis);
    memset(ans,-1,sizeof ans);
    bfs(x,y);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            printf("%-5d",ans[i][j]);
        }
        cout<<endl;
    }
    return 0;
}

posted on 2024-01-16 17:39  isomer莫柒瑜  阅读(41)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3