题意:
油田问题:相邻的可以合为一块田,这里相邻是指边上的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; }