石油採集(求聯通地區) 2018多校寒假集訓 (dfs+二分匹配)

來源:互聯網
上載者:User

標籤:case   als   blank   min   網路   line   while   scan   二分匹配   

題目:

連結:https://www.nowcoder.com/acm/contest/76/A
來源:牛客網

隨著海上運輸石油泄漏的問題,一個新的有利可圖的行業正在誕生,那就是撇油行業。如今,在墨西哥灣漂浮的大量石油,吸引了許多商人的目光。這些商人們有一種特殊的飛機,可以一瓢略過整個海面20米乘10米這麼大的長方形。(上下相鄰或者左右相鄰的格子,不能斜著來)當然,這要求一瓢撇過去的全部是油,如果一瓢裡面有油有水的話,那就毫無意義了,資源完全無法利用。現在,商人想要知道,在這片地區中,他可以最多得到多少瓢油。

地圖是一個N×N的網路,每個格子表示10m×10m的正方形地區,每個地區都被標示上了是油還是水
輸入描述:
測試輸入包含多條測試資料
測試資料的第一行給出了測試資料的數目T(T<75)
每個測試範例都用數字N(N<50)來表示地圖地區的大小,接下來N行,每行都有N個字元,其中符號’.’表示海面、符號’#’表示油麵。
輸出描述:
輸出格式如下“Case X: M”(X從1開始),M是商人可以最多得到的油量。

樣本1輸入
16.......##..........#..#..#..##......
輸出
Case 1: 3



題意:中文題不解釋



思路:way1:dfs爆搜就OK啊,,,這麼簡單的題目不知道為什麼當時沒有出
way2:二分匹配


代碼1:
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;int n,m;char mp[106][106];int dx[4]={0,1,0,-1};int dy[4]={1,0,-1,0};int ans1,ans2;void DFS(int i,int j){    int nx,ny;    if(i<0||i>=m||j<0||j>=n||mp[i][j]==‘.‘)        return ;        if((i+j)%2==0)ans1++;        else ans2++;    mp[i][j]=‘.‘;    for(int zz=0;zz<4;zz++)    {        nx=i+dx[zz];        ny=j+dy[zz];    DFS(nx,ny);    }    return ;}int main(){    int i,j,res=0;    int t;    cin>>t;    for(int o=1;o<=t;o++){        cin>>m;        n=m;        getchar();        for(i=0;i<m;i++)        {            for(j=0;j<n;j++)        {            scanf("%c",&mp[i][j]);        }                    getchar();        }        for(i=0;i<m;i++)            for(j=0;j<n;j++)        {            if(mp[i][j]==‘#‘)            {                 ans1=0;                ans2=0;                DFS(i,j);                res+=min(ans1,ans2);            }        }      printf("Case %d: %d\n",o,res);    }    return 0;}

 

代碼2:(思路簡單就不自己寫了)

#include <iostream>#include <queue>#include <algorithm>#include <string.h>#include <math.h>#include <map>using namespace std;const int maxn=2000;int girl[maxn],used[maxn],line[maxn][maxn],path[60][60],temp1,temp2;char a[60][60];bool find(int x){    for (int i=1;i<temp2;i++)    if (line[x][i]&&!used[i]) //x與i有關係    {        used[i]=1;        if (girl[i]==0||find(girl[i])) //名花無主或者還能騰位置;        {            girl[i]=x;            return true;        }    }    return false;}int main(){         int t,n,ans,tt;    cin>>t;    tt=1;    while (t--)    {        ans=0;        temp1=temp2=1;        memset(line,0,sizeof(line));        memset(girl,0,sizeof(girl));        memset(path,0,sizeof(path));        cin>>n;        for (int i=1;i<=n;i++)            for (int j=1;j<=n;j++)            {                cin>>a[i][j];                if ((i+j)%2==0)                path[i][j]=temp1++;                else                path[i][j]=temp2++;            }        for (int i=1;i<=n;i++)            for (int j=1;j<=n;j++)            {                if ((i+j)%2==1&&a[i][j]==‘#‘)                {                    if (path[i-1][j]>=1&&a[i-1][j]==‘#‘)                    line[path[i-1][j]][path[i][j]]=1;                    if (path[i+1][j]>=1&&a[i+1][j]==‘#‘)                    line[path[i+1][j]][path[i][j]]=1;                    if (path[i][j-1]>=1&&a[i][j-1]==‘#‘)                    line[path[i][j-1]][path[i][j]]=1;                    if (path[i][j+1]>=1&&a[i][j+1]==‘#‘)                    line[path[i][j+1]][path[i][j]]=1;                }            }        for (int i=1;i<temp1;i++)        {            memset(used,0,sizeof(used));            if (find(i))            ans++;        }        cout<<"Case "<<tt++<<": "<<ans<<endl;    }}

 

簡單題

石油採集(求聯通地區) 2018多校寒假集訓 (dfs+二分匹配)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.