hihocoder #1613 : 墨水滴 bfs+优先队列

来源:互联网 发布:怎样删除淘宝上的地址 编辑:程序博客网 时间:2024/03/28 19:18

#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;}
原创粉丝点击