内容 :
有一家石油公司負責探勘某塊地底下的石油含量,這塊地是矩行的,並且為了探勘的方便被切割為許多小塊。然後使用儀器對每個小塊去探勘。含有石油的小塊稱為 一個pocket。假如兩個pocket相連,則這兩個pocket屬於同一個oil deposit。(所謂相連的定義與踩地雷遊戲中的定義相同,請參考sample input, sample output)
你的任務就是要找出這塊地包含幾個不同的oil deposit。
你的任務就是要找出這塊地包含幾個不同的oil deposit。
输入说明 :
輸入包含好幾組資料,每組資料的第一行有2個整數m,n。m代表這塊地的列數,n代表這塊地的行數。(1<=m,n<=100),接下來的m行就是這塊地探勘的內容。'@'代表此小塊含石油,'*'代表此小塊不含石油。m=0 n=0代表輸入結束。
输出说明 :
對每組測試資料輸出oil deposit的數目。
范例输入 :
1 1 * 3 5 *@*@* **@** *@*@* 1 8 @@****@* 5 5 ****@ *@@*@ *@**@ @@@*@ @@**@ 0 0
范例输出 :
0 1 2 2
代码及思路分析:
/**
包含几个不同的oil deposit:
找即到独立的油田个数,就是跟它相邻的八个方向上都不能再有别的油田。
*/
#include<stdio.h>
#define N 101
int m,n,total;
char a[N][N];
int v[N][N];//标志数组
int dir[8][2]={{0,1},{0,-1},{1,0},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};//八个方向
void dfs(int x,int y)
{
int i;
if(a[x][y]!='@'||v[x][y]||x<0||y<0||x>=m||y>=n)
return ;
else
{
v[x][y]=1;
for(i=0;i<8;i++)//从(x,y)出发进行八个方向的遍历
{
dfs(x+dir[i][0],y+dir[i][1]);//对8个方向进行遍历
}
}
}
int main()
{
int i,j;
while(scanf("%d%d",&m,&n)!=EOF&&m+n!=0)
{
for(i=0;i<m;i++)
scanf("%s",a[i]);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
if(!v[i][j]&&a[i][j]=='@')//油田未被访问过
{
dfs(i,j);
total++; //记录连通油田的数量,每一次搜索一种油田
}
}
printf("%d\n",total);
}
return 0;
}