石油采集(求联通区域) 2018多校寒假集训 (dfs+二分匹配)
生活随笔
收集整理的這篇文章主要介紹了
石油采集(求联通区域) 2018多校寒假集训 (dfs+二分匹配)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:
鏈接: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輸入
1 6 ...... .##... ...... .#..#. .#..## ......輸出
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++;elsepath[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;} }?
簡單題
轉載于:https://www.cnblogs.com/huangzzz/p/8446352.html
總結
以上是生活随笔為你收集整理的石油采集(求联通区域) 2018多校寒假集训 (dfs+二分匹配)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 64位Windows2003 Enter
- 下一篇: 《终极算法》阅读笔记与摘要(1)-序和第