跑图

跑图

题目描述

跑图是RPG游戏中很烦躁的事情。玩家需要跑到距离他最近的传送点的位置。现在给你一张N × M的方格图,每个方格中数值0表示为平地,数值1表示为传送点,你的任务是输出一张 N × M 的矩阵, Matrixxy表示从 (x, y) 到距离它最近的传送点的距离。
这里的距离是曼哈顿距离,(x1, y1)→ (x2, y2) 的距离为∣x1 − x2∣ + ∣y1 − y2 ∣。

输入

第一行,有两个数n,m 。接下来n行,每行m个数。

数据保证至少有一个传送点。

1 ≤ n ≤ 500 , 1 ≤ m ≤ 500

样例输入

2 3
0 0 0
1 0 1

样例输出

1 2 1
0 1 0

代码

#include<bits/stdc++.h>
using namespace std;
int n,m;
int dir4[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
#define inf 9999999
struct node
{
 int x,y;
 int step;
 node(int x,int y,int step)
 {
  this->x=x;
  this->y=y;
  this->step=step;
 }
};
queue<node> q;
int mp[505][505];
int vis[505][505];
void bfs()
{
 while(!q.empty())
 {
  node t=q.front();
  q.pop();
  for(int i=0;i<4;i++)
  {
   int dx=t.x+dir4[i][0];
   int dy=t.y+dir4[i][1];
   if(dx < 1 || dy < 1 || dx > n || dy > m || vis[dx][dy]) continue;
   vis[dx][dy]=t.step+1;
   q.push(node(dx,dy,t.step+1));
  }
  
 }
}
int main()
{
 scanf("%d%d",&n,&m);
 int i,j;
 memset(vis,0,sizeof(vis));
 for(i=1;i<=n;i++)
 {
  for(j=1;j<=m;j++)
  {
   scanf("%d",&mp[i][j]);
   if(mp[i][j])
   {
    vis[i][j]=inf;
    q.push(node(i,j,0));
   }
  }
 }
 bfs();
 for(i=1;i<=n;i++)
 {
  for(j=1;j<=m;j++)
  {
   if(j!=1)printf(" ");
   if(vis[i][j]!=inf)
   printf("%d",vis[i][j]);
   else printf("0");
  }
  printf("\n");
 }
 return 0;
 } 

这一题使用的测评系统是zzulioj,郑州轻工业oj

题号为1557

可能在页数里显示不出来,直接搜即可

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值