2018: 跑图
题目描述:
跑图是RPG游戏中很烦躁的事情。玩家需要跑到距离他最近的传送点的位置。现在给你一张N×M的方格图,每个方格中数值0表示为平地,数值1表示为传送点,你的任务是输出一张N×M的矩阵,Matrix-xy表示从(x,y)到距离它最近的传送点的距离。这里的距离是曼哈顿距离,(x1,y1)→(x2,y2)的距离为∣x1−x2∣+∣y1−y2∣。
输入:
第一行,有两个数n,m。接下来n行,每行m个数。
数据保证至少有一个传送点。
1≤n≤500,1≤m≤500
输出:
n行,每行m个数,表示某个点到离它最近的传送点的距离。
样例输入
2 3
0 0 0
1 0 1
样例输出
1 2 1
0 1 0
主要思路:将所有传送点作为起点,bfs(不知道为什么,将next数组定义为全局变量时编译错误,于是将其定义在dfs函数中)
#include<iostream> #include<cstring> #include<queue> using namespace std; int a[505][505],visit[505][505]; int n,m,i,j; struct note { int x,y,s; note(int xx,int yy,int ss) { x=xx;y=yy;s=ss; } }; queue<note>q; void bfs() { int next[4][2]={1,0,0,1,-1,0,0,-1}; while (!q.empty()) { note t=q.front(); q.pop(); for (i=0;i<4;i++) { int tx=t.x+next[i][0]; int ty=t.y+next[i][1]; if (tx<1||tx>n||ty<1||ty>m||visit[tx][ty]!=0) continue; visit[tx][ty]=t.s+1; q.push(note(tx,ty,t.s+1)); } } } int main() { cin>>n>>m; memset(visit,0,sizeof(visit)); for (i=1;i<=n;i++) for (j=1;j<=m;j++) { cin>>a[i][j]; if (a[i][j]) { visit[i][j]=-1; q.push(note(i,j,0)); } } bfs(); for (i=1;i<=n;i++) { for (j=1;j<=m;j++) { if (visit[i][j]==-1) cout<<0; else cout<<visit[i][j]; if (j==m) cout<<endl; else cout<<' '; } } return 0; }