百度之星2017初賽A-1006-度度熊的01世界
阿新 • • 發佈:2017-08-12
-s 事物 pan 兩個 ext cin 完全 ace tput
度度熊的01世界
Accepts: 967 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description度度熊是一個喜歡計算機的孩子,在計算機的世界中,所有事物實際上都只由0和1組成。
現在給你一個n*m的圖像,你需要分辨他究竟是0,還是1,或者兩者均不是。
圖像0的定義:存在1字符且1字符只能是由一個連通塊組成,存在且僅存在一個由0字符組成的連通塊完全被1所包圍。
圖像1的定義:存在1字符且1字符只能是由一個連通塊組成,不存在任何0字符組成的連通塊被1所完全包圍。
連通的含義是,只要連續兩個方塊有公共邊,就看做是連通。
完全包圍的意思是,該連通塊不與邊界相接觸。
Input本題包含若幹組測試數據。 每組測試數據包含: 第一行兩個整數n,m表示圖像的長與寬。 接下來n行m列將會是只有01組成的字符畫。
滿足1<=n,m<=100
Output如果這個圖是1的話,輸出1;如果是0的話,輸出0,都不是輸出-1。
一道搜索題,為了防止邊界判斷的問題,我們不妨將地圖向外拓展一圈0,將大小(1,1)->(n,m)的圖轉化為(0,0)->(n+1,m+1)的圖,
首先分類討論一下,如果這個數字是零,那麽‘0‘聯通塊有兩個,‘1‘聯通塊有一個。
如果這個數字是一,那麽‘0‘聯通塊有一個,‘1‘聯通塊有一個。
其他情況表示既不是0也不是1.
我們可以先dfs填充‘0‘為‘2‘,再繼續填充‘1‘,找到這兩個值然後判斷一下就好了。
#include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f #define LL long long int e[105][105],n,m; int fx[4][2]={1,0,-1,0,0,1,0,-1}; int d1,d2,d3,d4,N1,N2; void dfs(int x,int y) { e[x][y]=2; for(int i=0;i<4;++i) { int dx=x+fx[i][0]; int dy=y+fx[i][1]; if(dx<d1||dy<d2||dx>d3||dy>d4||e[dx][dy]==N1||e[dx][dy]==N2) continue; dfs(dx,dy); } } int main() { int i,j,k; // freopen("in.txt","r",stdin); while(cin>>n>>m){memset(e,0,sizeof(e)); char x; for(i=1;i<=n;++i) { for(j=1;j<=m;++j){ cin>>x; e[i][j]=x-‘0‘; } } int s=1,s2=0; d1=0,d2=0,d3=n+1,d4=m+1; N1=1;N2=2; dfs(0,0); for(i=1;i<=n;++i) for(j=1;j<=m;++j) if(e[i][j]==0) {dfs(i,j);s++;} N1=2; for(i=1;i<=n;++i) for(j=1;j<=m;++j) if(e[i][j]==1) {dfs(i,j);s2++;} if(s==2&&s2==1) puts("0"); else if(s==1&&s2==1) puts("1"); else puts("-1"); } return 0; }
百度之星2017初賽A-1006-度度熊的01世界