2018河北省程序设计竞赛跑图

2018: 跑图

描述

题目描述:

跑图是RPG游戏中很烦躁的事情。玩家需要跑到距离他最近的传送点的位置。现在给你一张N \times MN×M的方格图,每个方格中数值00表示为平地,数值11表示为传送点,你的任务是输出一张N \times MN×M的矩阵,Matrix\_{xy}Matrixxy表示从(x,y)(x,y)到距离它最近的传送点的距离。 这里的距离是曼哈顿距离,(x\_1,y\_1) \rightarrow(x\_2,y\_2)(x1,y1)(x2,y2) 的距离为|x\_1-x\_2|+|y\_1-y\_2|x1x2+y1y2

输入:

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

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

1 \leq n \leq 5001n5001 \leq m \leq 5001m500

输出:

nn行,每行mm个数,表示某个点到离它最近的传送点的距离。

样例输入
2 3
0 0 0
1 0 1
样例输出
1 2 1
0 1 0
描述

题目描述:

跑图是RPG游戏中很烦躁的事情。玩家需要跑到距离他最近的传送点的位置。现在给你一张N \times MN×M的方格图,每个方格中数值00表示为平地,数值11表示为传送点,你的任务是输出一张N \times MN×M的矩阵,Matrix\_{xy}Matrixxy表示从(x,y)(x,y)到距离它最近的传送点的距离。 这里的距离是曼哈顿距离,(x\_1,y\_1) \rightarrow(x\_2,y\_2)(x1,y1)(x2,y2) 的距离为|x\_1-x\_2|+|y\_1-y\_2|x1x2+y1y2

输入:

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

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

1 \leq n \leq 5001n5001 \leq m \leq 5001m500

输出:

nn行,每行m

m个数,表示某个点到离它最近的传送点的距离


比赛脑子犯抽  这都没想出来  宛如zz

多点bfs 同时搜  

#include 
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mset(a,b) memset(a,b,sizeof(a))
#define sz size()
#define cl clear()
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define PI 3.1415926535897932384626433832795028841971693993751058209749445923078164
typedef long long ll;
const int inf = 99999999;
const double eps = 1e-8;
const int dir4[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
const int dir8[8][2] = {{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};
const ll mod = 2000000000000000003;
struct node{
	int x,y;
	int step;
	node(int x,int y,int step)
	{
		this->x = x;
		this->y = y;
		this->step = step;
	}
};
int mp[505][505],vis[505][505];
int n, m;
queue q;

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() 
{
    cin >> n >> m;
    
    for(int i = 1;i <= n;i ++)
    {
    	for(int j = 1;j <= m;j ++)
    	{
    		cin >> mp[i][j];
    		if(mp[i][j])
    		{
    			vis[i][j] = inf;
    			q.push(node(i,j,0));
			}
		}
	}
	
	bfs();
	
	for(int i = 1;i <= n;i ++)
    {
    	for(int j = 1;j <= m;j ++)
    	{
    		if(j != 1)
    		cout << " ";
    		
    		if(vis[i][j] != inf)
    		cout << vis[i][j];
    		else
    		cout << 0 ;
		}
		cout << endl;
	}
    return 0;
}

你可能感兴趣的:(2018河北省程序设计竞赛跑图)