codeforces723d

来源:互联网 发布:linux ftp和vsftp 编辑:程序博客网 时间:2024/06/10 00:50

这个题就是这么回事,先找dfs找湖的位置,和大小,然后,结构体排序,再来找k以上的湖,把他们给填了,就结了

#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;struct node{    int x , y , sum;}str[3000];bool cmp(node a , node b){    return a.sum > b.sum;}char map[55][55];int n , m , k , num ,flag , vis[55][55] , d[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};void dfs(int i , int j ){    //if(map[i][j] == '*'||vis[i][j]) return;    num++;    vis[i][j] = 1;    for(int k = 0 ; k < 4 ; k++){        //printf("i = %d\n",i);        int x = d[k][0] + i;        int y = d[k][1] + j;        if(x < 0 || y < 0 || x >= n || y >= m){            flag = 0;//flag是用来看这条支路是否出界,如果出界,则这条子路是不可用的,num也一样            continue;        }        if(map[x][y] == '*'||vis[x][y]) continue;        //printf("x = %d y = %d",x, y);        dfs(x , y);    }}void dfsl(int i , int j){    if(map[i][j] == '.')        map[i][j] = '*';    for(int k = 0 ; k < 4 ; k++){        int x = i + d[k][0];        int y = j + d[k][1];        if(x >= n || y >= m || x < 0 || y < 0 || map[x][y] == '*'){            continue;        }        //if(x == 1 &&y == 2)        //printf("i = %d j = %d",i ,j);        dfsl(x,y);    }}int main(){    scanf("%d %d %d",&n , &m , &k);    for(int i = 0 ; i < n ; i++)        scanf("%s",map[i]);    //printf("asdf");    int cnt = -1;    for(int i = 0 ; i < n ; i++){//先dfs找一遍,湖的位置和数目        for(int j = 0 ; j < m ; j++){            //printf("!!\n");            num = 0,flag = 1;            if(!vis[i][j] && map[i][j] == '.'){                //printf("6\n");                dfs(i,j);                if(flag){                   str[++cnt].sum = num;                   str[cnt].x = i;                   str[cnt].y = j;                }            }        }    }    //printf("**\n");    sort(str , str + cnt + 1,cmp);    int ans = 0;    for(int i = k ; i <= cnt ; i++){//然后再找各种来更改        ans += str[i].sum;        //printf("x = %d y = %d\n",str[i].x,str[i].y);        dfsl(str[i].x , str[i].y);//把湖都变成土    }    printf("%d\n",ans);    for(int i = 0 ; i < n ; i++)        puts(map[i]);    printf("\n");    return 0;}

其实d也不是很难,我感觉以后打个rating1900还是可以的

0 0