1. 程式人生 > 其它 >D. 1.綠紋龍的森林遊記

D. 1.綠紋龍的森林遊記

技術標籤:廣度優先搜尋

Description
暑假來了,綠紋龍很高興。於是飄飄乎就來到了森林一日遊。可是他卻看到了很不和諧的一幕,一群獵人在森林裡圍捕小動物。森林可以看做是一個10*10的方格,如下圖所示,1表示獵人,0表示小動物。

Alt

已知獵人保持不動,而小動物可以往上下左右任意方向逃脫(當然不能撞上獵人)。小動物可以逃出森林。但上圖背景色被標紅的那部分小動物將永遠無法逃脫獵人的魔爪。

Input
一個10*10的矩陣,描述森林中獵人和小動物分佈的情況。保證每個點要麼為獵人,要麼為小動物。

Output
一個整數,表示不能逃脫獵人魔爪的小動物數量。

Samples
Input
0 0 0 0 0 0 0 0 0 0

0 0 0 0 1 1 1 0 0 0
0 0 0 0 1 0 0 1 0 0
0 0 0 0 0 1 0 0 1 0
0 0 1 0 0 0 1 0 1 0
0 1 0 1 0 1 0 0 1 0
0 1 0 0 1 1 0 1 1 0
0 0 1 0 0 0 0 1 0 0
0 0 0 1 1 1 1 1 0 0
0 0 0 0 0 0 0 0 0 0
Output
15

# include<iostream>
# include<queue>
using namespace std;
struct node{
	int x;
	int y;
};
queue<node>q;

int a[15][15],ans;
int xx[4]={0,0,1,-1};
int yy[4]={
1,-1,0,0}; inline int read(){ int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();} while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();} return x*f; } void bfs(int u,int v){ q.push({u,v}); while(!q.empty()){ for(int i=0;i<4;i++){ node x=q.front(); int dx=
xx[i]+x.x ; int dy=yy[i]+x.y; if(dx>=0&&dx<=11&&dy>=0&&dy<=11&&!a[dx][dy]){ q.push({dx,dy}); a[dx][dy]=1; } } q.pop(); } } int main(){ for(register int i=1;i<=10;++i) for(register int j=1;j<=10;++j) a[i][j]=read(); bfs(0,0); for(register int i=1;i<=10;++i) for(register int j=1;j<=10;++j) if(a[i][j]==0) ans++; cout<<ans; return 0; }