题意:
油田问题:相邻的可以合为一块田,这里相邻是指边上的8个方向…求最少油田数量。
分析:
本题实际上是做一个搜索矩阵的连通子集。
简单的dfs就可以解决,还不用剪枝。^_^
一开始我回溯考虑太多了,其实只需在dfs函数里放个:
if(a[x][y]=='*')return;就行的,
然后又有个问题:什么时候计数增1.找我那么做,要疯了的。
现在只需在一开始从起点开始计算count++,搞定。
还有一个学习的就是对二位字符串数组的初始化。
memset(a, '*', 105 * 105 * sizeof(char));
#include <stdio.h>
#include <string.h>
char a[105][105];
int dir[8][2]={{0,1},{0,-1},{1,0},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};
int count,n,m,flag;
void dfs(int x, int y)
{
int i;
if(a[x][y]=='*') return;
a[x][y]='*';
for(i=0;i<8;i++)
{
dfs(x+dir[i][0],y+dir[i][1]);
}
}
int main()
{
char s[1000];
int i,j;
while(scanf("%d%d",&n,&m)!=EOF)
{
count=0;
flag=0;
memset(a, '*', 105 * 105 * sizeof(char));//对二维字符串数组进行初始化
if(n==0&&m==0) break;
for(i=1;i<=n;i++)
{
gets(s);
for(j=1;j<=m;j++)
{
scanf("%c",&a[i][j]);
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(a[i][j]=='@')
{
count++;
dfs(i,j);
}
}
}
printf("%d\n",count);
}
return 0;
}