hdu 1241 Oil Deposits思路解析

内容 :

有一家石油公司負責探勘某塊地底下的石油含量,這塊地是矩行的,並且為了探勘的方便被切割為許多小塊。然後使用儀器對每個小塊去探勘。含有石油的小塊稱為 一個pocket。假如兩個pocket相連,則這兩個pocket屬於同一個oil deposit。(所謂相連的定義與踩地雷遊戲中的定義相同,請參考sample input, sample output)

你的任務就是要找出這塊地包含幾個不同的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;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值