UVA572-油田 Oil Deposits(DFS)

樣例輸入: 

1 1

*

3 5

*@*@*

**@**

*@*@*

1 8

@@****@*

5 5

****@

*@@*@

*@**@

@@@*@

@@**@

0 0 

樣例輸出: 

0

1

2

AC Code: 

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s[101][101];//存入地圖的數組 
int sum,n,m;
int vis[101][101];//標記數組 
int dx[]={-1,0,1,-1,1,-1,0,1};//題中說的是橫、豎、對角線,所以有8個方向 
int dy[]={-1,-1,-1,0,0,1,1,1};
bool judge(int x,int y) {
	if(x>=0&&x<n&&y>=0&&y<m&&vis[x][y]==0&&s[x][y]=='@')//越界判斷 
		return true;
	return false;
}
void dfs(int x,int y) {
	vis[x][y]=1;//標記訪問過的每個點 
	for(int k=0;k<8;k++) {//8個方向搜索 
		int tx=x+dx[k];
		int ty=y+dy[k];
		if(judge(tx,ty)) {
			dfs(tx,ty);
		}
	}
}
int main() {
	while(~scanf("%d %d",&n,&m)) {//多實例輸入 
		if(!n&&!m)//n和m均爲0,輸入結束 
			break;
		for(int i=0;i<n;i++)
			for(int j=0;j<m;j++)
				scanf(" %c",&s[i][j]);//%前面的空格確保地圖可以完整輸入 
		memset(vis,0,sizeof(vis));//標記數組清零 
		sum=0;//油田數量 
		for(int i=0;i<n;i++) {
			for(int j=0;j<m;j++) {
				if(vis[i][j]==0&&s[i][j]=='@') {//此點未被訪問,從找到的某個油田處開始搜索 
					sum++;//數量加1,並且搜索出與這個油田相連的所有油田,算1個石油區域 
					dfs(i,j);
				}
			}
		}
		printf("%d\n",sum);
	}
	return 0;
} 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章