題意:
油田問題:相鄰的可以合為一塊田,這裡相鄰是指邊上的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;}