CF #375 (Div. 2) D. bfs

1、CF #375 (Div. 2)  D. Lakes in Berland

2、总结:麻烦的bfs,但其实很水。。

3、题意:n*m的陆地与水泽,水泽在边界表示连通海洋。最后要剩k个湖,总要填掉多少个湖,然后输出。

#include<bits/stdc++.h>
#define F(i,a,b) for (int i=a;i<b;i++)
#define FF(i,a,b) for (int i=a;i<=b;i++)
#define mes(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
const int N=2100,MAX=1000100;
struct Node
{
    int i,j,num;
    bool operator < (const Node &a)const{
        return num>a.num;
    }
};

int n,m,k,num,flag;
int diri[4]={0,0,1,-1};
int dirj[4]={1,-1,0,0};
int vis[80][80];
char mapn[80][80];

bool charge(Node e)
{
    if(mapn[e.i][e.j]==‘.‘&&e.i>=0&&e.i<n&&e.j>=0&&e.j<m&&!vis[e.i][e.j])
        return true;
    return false;
}

bool charge2(Node e)
{
    if(e.i==0||e.i==n-1||e.j==0||e.j==m-1)
        return true;
    return false;
}

void bfs(int i,int j)
{
    queue<Node>Q;
    Node st,en;
    st.i=i,st.j=j;
    vis[i][j]=1;
    Q.push(st);
    if(charge2(st)){flag=0;}
    while(!Q.empty())
    {
        st=Q.front();Q.pop();
        F(l,0,4){
            en.i=st.i+diri[l];
            en.j=st.j+dirj[l];
            if(charge(en)){
                if(charge2(en))flag=0;
                vis[en.i][en.j]=1;
                Q.push(en);
                num++;
            }
        }
    }

}

void bfs2(int i,int j)
{
    queue<Node>Q;
    Node st,en;
    st.i=i,st.j=j;
    vis[i][j]=1;
    Q.push(st);
    while(!Q.empty())
    {
        st=Q.front();Q.pop();
        F(l,0,4){
            en.i=st.i+diri[l];
            en.j=st.j+dirj[l];
            if(mapn[en.i][en.j]==‘.‘){
                mapn[en.i][en.j]=‘*‘;
                Q.push(en);
            }
        }

    }
}

int main()
{
    while(~scanf("%d%d%d",&n,&m,&k))
    {
        int num1=0;
        priority_queue<Node>Q;
        mes(vis,0);
        F(i,0,n)scanf("%s",mapn[i]);
        F(i,0,n) F(j,0,m){
            if(mapn[i][j]==‘.‘&&i>=0&&i<n&&j>=0&&j<m&&!vis[i][j]){
                num=1,flag=1;
                bfs(i,j);
                if(flag){
                    num1++;
                    Node ans;ans.i=i,ans.j=j,ans.num=num;
                    Q.push(ans);
                }
            }
        }
        mes(vis,0);
        int sum=0;
        num1-=k;
        while(num1--){
            Node ans=Q.top();Q.pop();
            sum+=ans.num;
            mapn[ans.i][ans.j]=‘*‘;
            bfs2(ans.i,ans.j);
        }
        cout<<sum<<endl;
        F(i,0,n)printf("%s\n",mapn[i]);
    }

    return 0;
}

时间: 2024-12-25 17:24:16

CF #375 (Div. 2) D. bfs的相关文章

C. Ice Cave (CF #301 (Div. 2) 搜索bfs)

C. Ice Cave time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output You play a computer game. Your character stands on some level of a multilevel ice cave. In order to move on forward, you need to

CF #371 (Div. 2) C、map标记

1.CF #371 (Div. 2)   C. Sonya and Queries  map应用,也可用trie 2.总结:一开始直接用数组遍历,果断T了一发 题意:t个数,奇变1,偶变0,然后与问的匹配. #include<bits/stdc++.h> #define max(a,b) a>b?a:b #define F(i,a,b) for (int i=a;i<=b;i++) #define mes(a,b) memset(a,b,sizeof(a)) #define INF

CF#247(Div. 2)部分题解

引言: 在软件项目中,Maven提供了一体化的类库管理系统,非常实用.但是,如果新增的类库jar在网络上无法获取到,如何在本地按照Maven的规则添加进来呢?本文将通过一个小例子展示新增过程. 背景介绍: 一个Maven管理的Java项目,提供一个系统级别的POM.xml,其中定义了整个项目使用的类库. 需求: 需要添加一个自定义的类库到当前项目中.假定当前的类库文件名为:abc.jar.. 如何将类库添加进来? 1.  找到当前Maven的Repository类库位置 一般默认情况下,在win

CF #374 (Div. 2) D. 贪心,优先队列或set

1.CF #374 (Div. 2)   D. Maxim and Array 2.总结:按绝对值最小贪心下去即可 3.题意:对n个数进行+x或-x的k次操作,要使操作之后的n个数乘积最小. (1)优先队列 #include<bits/stdc++.h> #define F(i,a,b) for (int i=a;i<b;i++) #define FF(i,a,b) for (int i=a;i<=b;i++) #define mes(a,b) memset(a,b,sizeof(

cf #254 (Div. 2)

a题 #include<stdio.h> #include<string.h> char c[101][101]; int main() { long n,m,i,j; scanf("%ld%ld",&n,&m); gets(c[0]); for(i=1;i<=n;i++) gets(c[i]); for(i=1;i<=n;i++) { for(j=0;j<m;j++) if(c[i][j]=='-') printf("

B. Mr. Kitayuta&#39;s Colorful Graph (CF #286 (Div. 2) 并查集)

B. Mr. Kitayuta's Colorful Graph time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Mr. Kitayuta has just bought an undirected graph consisting of n vertices and m edges. The vertices of the g

CF #374 (Div. 2) C. Journey dp

1.CF #374 (Div. 2)    C.  Journey 2.总结:好题,这一道题,WA,MLE,TLE,RE,各种姿势都来了一遍.. 3.题意:有向无环图,找出第1个点到第n个点的一条路径,经过的点数要最多. #include<bits/stdc++.h> #define F(i,a,b) for (int i=a;i<b;i++) #define FF(i,a,b) for (int i=a;i<=b;i++) #define mes(a,b) memset(a,b,

CF #365 (Div. 2) D - Mishka and Interesting sum 离线树状数组(转)

转载自:http://www.cnblogs.com/icode-girl/p/5744409.html 题目链接:CF #365 (Div. 2) D - Mishka and Interesting sum 题意:给出n个数和m个询问,(1 ≤ n, m ≤ 1 000 000) ,问在每个区间里所有出现偶数次的数异或的值. 思路:容易想到,把区间内的所有的数都异或得到的是出现奇数次的数的值,然后再异或该区间内的所有出现过的数(每个数只统计一次),得到的ans了. 第一个问题:得到询问区间的

CF #365 (Div. 2) D - Mishka and Interesting sum 离线树状数组

题目链接:CF #365 (Div. 2) D - Mishka and Interesting sum 题意:给出n个数和m个询问,(1 ≤ n, m ≤ 1 000 000) ,问在每个区间里所有出现偶数次的数异或的值. 思路:容易想到,把区间内的所有的数都异或得到的是出现奇数次的数的值,然后再异或该区间内的所有出现过的数(每个数只统计一次),得到的ans了. 第一个问题:得到询问区间的所有数的异或值,由 a[l~r] ^ a[0~(l-1)] = a[l~r] 可以用数组all_xor[i