跑图
题目描述
跑图是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
可能在页数里显示不出来,直接搜即可