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≤5001≤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;
}

 

 

 

posted @ 2019-05-04 21:56  20190315  阅读(358)  评论(0编辑  收藏  举报