#1613 : 墨水滴
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
小Ho有一张白纸,上面有NxN个格子。小Ho可以选择一个格子(X, Y),在上面滴一滴墨水。如果这滴墨水的颜色深度是G,那么这个格子也会被染成深度为G的格子。同时周围的格子也会被这滴墨水浸染,不过颜色深度会略微降低。具体来说,如果一个格子距离(X, Y)的曼哈顿距离是D,那么它会被染成深度为max{0, G-D}的格子。
例如在(3, 3)滴一滴颜色深度为10的墨水,则(2, 3)(4, 3)(3, 2)(3, 4)四个格子会被染成深度为9,(1, 3)(2, 2)(2, 3)(3, 1)(3, 5)(4, 2)(4, 4)(5, 3)会被染成深度为8……
现在小Ho在K个格子中都滴了一滴墨水。于是一个格子可能被多滴墨水浸染,这时它的颜色深度是单滴墨水浸染时最高的颜色深度。
给定K滴墨水的位置和颜色深度,你能帮小Ho算出最后整张白纸上所有格子的颜色深度吗?
输入
第一行包含两个整数N和K。
以下K行每行包含三个整数Xi, Yi和Gi。
对于30%的数据, 1 ≤ N, K ≤ 100
对于100%的数据,1 ≤ N ≤ 1000 1 ≤ K ≤ 10000 0 ≤ Xi, Yi < N 0 ≤ Gi < 2048
输出
输出一个NxN的矩阵,代表每个格子最终的颜色深度
样例输入
3 2
0 0 10
2 2 10
样例输出
10 9 8
9 8 9
8 9 10
思路:每次bfs最大高度的位置往四周流,需要加访问数组,传递的值要大于等于1。注意越界。最坑的是单实例,RE了n次,还好有大佬提醒。
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1005;
bool vis[MAXN][MAXN];
int dist[MAXN][MAXN];
int dx[4]= {1,0,-1,0};
int dy[4]= {0,1,0,-1};
int n;
struct node
{
int x, y, k;
bool operator < (const node &a)const
{
return k<a.k;
}
};
priority_queue<node>q;
void bfs()
{
while(!q.empty())
{
node tmp = q.top();
q.pop();
if(!vis[tmp.x][tmp.y])
{
vis[tmp.x][tmp.y]=true;
dist[tmp.x][tmp.y]=tmp.k;
}
else
continue;
int x=tmp.x, y=tmp.y;
int nx, ny;
for(int i=0; i<4; ++i)
{
nx=x+dx[i];
ny=y+dy[i];
if(!vis[nx][ny]&&nx>=0&&nx<n&&ny<n&&ny>=0)
{
if(tmp.k-1>=1)
q.push((node)
{
nx,ny,tmp.k-1
});
}
}
}
}
int main()
{
int k;
scanf("%d %d", &n, &k);
int x,y,c;
memset(vis, false, sizeof(vis));
memset(dist, 0, sizeof(dist));
for(int i=1; i<=k; ++i)
{
scanf("%d %d %d", &x, &y, &c);
q.push((node)
{
x, y, c
});
}
bfs();
for(int i=0; i<n; ++i)
{
for(int j=0; j<n; ++j)
printf("%d%c", dist[i][j], " \n"[j==n-1]);
}
return 0;
}