標籤: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+二分匹配)