D. Lakes in Berland

来源:互联网 发布:淘宝玻璃钢化粪罐 编辑:程序博客网 时间:2024/06/05 04:30

D. Lakes in Berland
题目地址:
http://codeforces.com/problemset/problem/723/D
AC代码

#include<cstdio>#include<algorithm>#include<string.h>using namespace std;struct node//存储某个湖的其中的一片水位置以及面积{    int x,y,s;}n[4000];//设置一些需要的变量 char map[51][51];//湖的结构int n1,m,k;//n1行 m列 k留下的湖的数量 int book[51][51],lake_num,lake_area,dx[4]={0,0,1,-1},dy[4]={1,-1,0,0}; int flag; int are; // int cmp(node a,node b) {    return a.s<b.s; } //靠海湖设置flag标记 flag标记为0 则表示为靠海湖  不计入湖的数量 void dfs(int x,int y)//查找湖  并且记录湖的面积  {    lake_area++;    book[x][y] = 1;     for(int i=0;i<4;i++)     {        int newx=dx[i]+x;        int newy=dy[i]+y;         if(newx < 0 || newy < 0 || newx > n1-1 || newy > m-1){          lake_area = 0,flag  = 0;           continue;        }        if(map[newx][newy] == '*' || book[newx][newy])            continue;        dfs(newx,newy);     } }void dfs1(int x,int y)//填湖 {     map[x][y]='*';     for(int i=0;i<4;i++)     {        int newx=dx[i]+x;        int newy=dy[i]+y;        if(map[newx][newy]=='.')         dfs1(newx,newy);        }}int main(){    scanf("%d%d%d",&n1,&m,&k);    for(int i=0;i<n1;i++)    {        scanf("%s",map[i]);    }    //初始化    memset(book,0,sizeof(book));    lake_num=0;    lake_area=0;    //      for(int i=0;i<n1;i++)    {        for(int j=0;j<m;j++)        {            lake_area=0;flag=1;             if(map[i][j]=='.'&&!book[i][j])            {                dfs(i,j);                if(flag)                {                    n[lake_num].x=i;                    n[lake_num].y=j;                    n[lake_num++].s=lake_area;                }            }        }    }    //按照湖的面积进行排序  因为需啊求出填最小的水块数  所以先填水块少的湖    sort(n,n+lake_num,cmp);    int summ=0;    for(int i=0;i<lake_num-k;i++)    {        summ+=n[i].s;        dfs1(n[i].x,n[i].y);     }      printf("%d\n",summ);    for(int i=0;i<n1;i++)        printf("%s\n",map[i]);    return 0;}

代码AC时间 2017-7-19 00:47
文章完成时间2017-7-19 16:50

原创粉丝点击