1. 程式人生 > >百度之星2017初賽A-1006-度度熊的01世界

百度之星2017初賽A-1006-度度熊的01世界

-s 事物 pan 兩個 ext cin 完全 ace tput

度度熊的01世界

Accepts: 967 Submissions: 3064 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世界