1682: 全球变暖

题目描述

由于全球变暖,岛国S的沿岸的海水不断上涨,形式岌岌可危。

S国的地图是由n*m个网格组成的,网格由.和#组成,#代表的区域是陆地,.和地图外面全是海水。

每天,海水将侵蚀相邻的陆地,即如果陆地与海水相邻的话,第二天就会变成海水。这里面的两块相邻表示两块之间公用一条边。

比如S国的地图是这样的:

..###...

..###...

..###...

...##...

..######

..######

...#####

那么一天后,S国就变成了这样:

........

...#....

...#....

........

...##...

...####.

........

这种悲剧每天都在发生,再过1天S国就将被海水吞没。

现在S国的领导想知道t天后S国将变成什么样,有几块岛屿。。 如果两块陆地属于同一岛屿,当且仅当两块陆地相邻。

比图上面1天后S的地图中有两块岛屿。

输入

多组样例数入(样例不多)。

第一行是n,m,t,题目中已描述。(1<=n,m,t,<=2000)

然后是一个n行m列的S国地图,由.和#组成。

输出

第一行一个整数x表示岛屿数。

接下来n行画出t天后S国的地图。

样例输入

7 8 1
..###...
..###...
..###...
...##...
..######
..######
...#####

样例输出

2
........
...#....
...#....
........
...##...
...####.
........这道 题目代码量还是很大的。bfs+dfs类似于 白书上的Fire!
/* ***********************************************
Author        :guanjun
Created Time  :2016/3/8 8:53:07
File Name     :neu1682.cpp
************************************************ */
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <iomanip>
#include <list>
#include <deque>
#include <stack>
#define ull unsigned long long
#define ll long long
#define mod 90001
#define INF 0x3f3f3f3f
#define maxn 10010
#define cle(a) memset(a,0,sizeof(a))
const ull inf = 1LL << 61;
const double eps=1e-5;
using namespace std;

struct node{
    int x,y;
};

char mp[2010][2100];
int vis[2010][2010];
int dir[4][2]={1,0,0,1,0,-1,-1,0};
int n,m,t;

void dfs(int x,int y){
    for(int i=0;i<4;i++){
        int nx=x+dir[i][0];
        int ny=y+dir[i][1];
        if(!vis[nx][ny]&&nx<=n&&nx>=1&&ny<=m&&ny>=1&&mp[nx][ny]==‘#‘){
            vis[nx][ny]=1;
            dfs(nx,ny);
        }
    }
}
void print(){
    int ans=0;
    cle(vis);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(mp[i][j]==‘#‘&&!vis[i][j]){
                vis[i][j]=1;
                dfs(i,j);
                ans++;
            }
        }
    }
    printf("%d\n",ans);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++)
            printf("%c",mp[i][j]);
        printf("\n");
    }
}
void bfs(){
    queue<node>q;
    int tmp=1;node u;
    t--;
    for(int i=0;i<=n+1;i++){
        mp[i][0]=‘.‘;
        mp[i][m+1]=‘.‘;
    }
    for(int i=0;i<=m+1;i++){
        mp[0][i]=‘.‘;
        mp[n+1][i]=‘.‘;
    }
    for(int i=0;i<=n+1;i++){
        for(int j=0;j<=m+1;j++){
            if(mp[i][j]==‘.‘&&!vis[i][j]){
                for(int k=0;k<4;k++){
                    int nx=i+dir[k][0];
                    int ny=j+dir[k][1];
                //  cout<<nx<<" "<<ny<<endl;
                    if(nx<=n&&nx>=1&&ny<=m&&ny>=1){
                        if(mp[nx][ny]==‘#‘){
                            //cout<<nx<<" "<<ny<<endl;
                            node w;w.x=nx;w.y=ny;
                            q.push(w);
                            mp[nx][ny]=‘.‘;
                            //u.x=i,u.y=j,q.push(u);
                            vis[nx][ny]=1;
                        }
                    }
                }
                vis[i][j]=1;
            }
        }
    }

    if(t==0){
        print();
    }
    else{
        queue<node>p;
        //cout<<t<<endl;
        while(t--){
            while(!q.empty()){
                node v=q.front();q.pop();
            //  cout<<v.x<<" "<<v.y<<endl;
                for(int i=0;i<4;i++){
                    int nx=v.x+dir[i][0];
                    int ny=v.y+dir[i][1];
                    if(nx<=n&&nx>=1&&ny<=m&&ny>=1){
                        if(mp[nx][ny]==‘#‘){
                            mp[nx][ny]=‘.‘;u.x=nx,u.y=ny;
                            p.push(u);
                        }
                    }
                    //vis[nx][ny]=1;
                }

            }
            if(p.empty())break;
            while(!p.empty()){
                q.push(p.front());p.pop();
            }
        }
        print();
    }
}
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    #endif
    //freopen("out.txt","w",stdout);
    while(cin>>n>>m>>t){
        for(int i=1;i<=n;i++){
            scanf("%s",mp[i]+1);
        }
        bfs();
    }
    return 0;
}
				
时间: 2024-11-03 22:27:59

1682: 全球变暖的相关文章

51nod 1682 中位数计数

1682 中位数计数基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 中位数定义为所有值从小到大排序后排在正中间的那个数,如果值有偶数个,通常取最中间的两个数值的平均数作为中位数. 现在有n个数,每个数都是独一无二的,求出每个数在多少个包含其的区间中是中位数. Input 第一行一个数n(n<=8000) 第二行n个数,0<=每个数<=10^9 Output N个数,依次表示第i个数在多少包含其的区间中是中位数. Input示例 5 1 2 3 4 5

1682: [Usaco2005 Mar]Out of Hay 干草危机

1682: [Usaco2005 Mar]Out of Hay 干草危机 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 391  Solved: 258[Submit][Status] Description The cows have run out of hay, a horrible event that must be remedied immediately. Bessie intends to visit the other farms

URAL 1682 Crazy Professor (并查集)

[题目链接] http://acm.timus.ru/problem.aspx?space=1&num=1682 [题目大意] 给出k,从1开始不断地加一并把这个数写在黑板上,如果写上的数字和之前的数字满足 (a+b*b)%k=0或者(b+a*a)%k=0就在他们之间连一条线,如果黑板上出现环就结束,问能写几个数 [题解] 我们发现写到2k-1的时候,就一定会产生一个环,所以我们只要枚举数字 往满足要求的地方连边,判断是否出现环即可 [代码] #include <cstdio> #in

51nod 1682 中位数计数(前缀和)

51nod 1682 中位数计数 思路: sum[i]表示到i为止的前缀和(比a[i]小的记为-1,相等的记为0,比a[i]大的记为1,然后求这些-1,0,1的前缀和): hash[sum[i]+N](由于sum[i]会小于0,所以要加N)记录在j<i的情况下sum[i]是否出现过,如果在j>=i的情况下,sum[i]还出现过,那么就代表有一个区间满足条件. 代码: #include<bits/stdc++.h> using namespace std; #define ll lo

全球变暖

标题:全球变暖 你有一张某海域NxN像素的照片,"."表示海洋."#"表示陆地,如下所示: ....... .##.... .##.... ....##. ..####. ...###. ....... 其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿.例如上图就有2座岛屿. 由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没.具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹

mysql5.7报错 1546、1577和1682问题分析

环境说明:MySQL5.6.40 上xtrabackup全备备份的数据导入到mysql5.7.24实例上,启动MySQL5.7的服务,登录数据库MySQL5.7实例.但是在drop user [email protected]'127.0.0.1'时,报错如下: 2019-08-15T19:02:31.160910+08:00 1546 [ERROR] /usr/local/mysql5.7/bin/mysqld: Column count of mysql.user is wrong. Exp

ERROR 1682 (HY000): Native table &#39;performance_schema&#39;.&#39;session_variables&#39; has the wrong structure

mysql 5.6升级到mysql5.7查看参数报错 [email protected] [(none)]>show variables like '%data%'; ERROR 1682 (HY000): Native table 'performance_schema'.'session_variables' has the wrong structure --从mysql5.7.6开始information_schema.global_status已经开始被舍弃,为了兼容性,此时需要打开

acdream 1682(有环的最大连续和)

题意:有n个数字围成一个圈,然后从圆圈拿走连续的一些数,问拿走的数的和的最大值是多少. 题解:普通最大连续和的做法,如果前面累加的数加当前数是大于最大值就更新最大值,如果小于0就把累加值清零,这个是有环的,那么可以从两种情况考虑,一种是普通的最大连续和找到的最大值,另一种就是头尾拼接的,把所有数取相反数,然后找到最大连续和,那么用总和sum加这个数就是头尾拼接的最大值,取两种情况较大的就是解. #include <stdio.h> #include <algorithm> usin

acdream 1682 吃不完的糖果(环形最大子段和)

Problem Description 娜娜好不容易才在你的帮助下"跳"过了这个湖,果然车到山前必有路,大战之后必有回复,大难不死,必有后福!现在在娜娜面前的就是好多好多的糖果还有一些黑不溜秋的东西!不过娜娜眼中只有吃不完的糖果!娜娜高兴地快要蹦起来了! 这时有一位挥着翅膀的女孩(天使?鸟人?)飞过来,跟娜娜说,这些糖果是给你的~(娜娜已经两眼放光)~你可以带走~(娜娜已经流下了口水)~但是~(神马?还有但是?)~这位神仙姐姐挥一挥翅膀~飘过了一片云彩,糖果和那些黑不溜秋的东西顿时飞了