{‘W‘,‘.‘,‘.‘,‘W‘,‘.‘}, {‘W‘,‘.‘,‘.‘,‘.‘,‘.‘}, {‘.‘,‘.‘,‘.‘,‘W‘,‘.‘}, {‘W‘,‘.‘,‘.‘,‘.‘,‘.‘}, {‘W‘,‘.‘,‘W‘,‘W‘,‘W‘}例子,此处有5处积水
题目:有N*M格子的花园,W表示积水,‘.‘表示干地,积水附近8个区域只要有积水,那么这两处连通,并算作是同一处积水,问一共有几处积水?
思路:穷竭搜索,O(N*M),搜索到积水则变成‘.’,并搜索连通的积水将其变成‘.’,直到这块积水搜索结束,此时a+=1,此处积水全变为‘.’
1 #include <stdio.h> 2 void dfs(int x,int y); 3 void solve(); 4 int N=5,M=5; 5 char ch[5][5]={ 6 {‘W‘,‘.‘,‘.‘,‘W‘,‘.‘}, 7 {‘W‘,‘.‘,‘.‘,‘.‘,‘.‘}, 8 {‘.‘,‘.‘,‘.‘,‘W‘,‘.‘}, 9 {‘W‘,‘.‘,‘.‘,‘.‘,‘.‘}, 10 {‘W‘,‘.‘,‘W‘,‘W‘,‘W‘} 11 }; 12 int main() 13 { 14 15 solve(); 16 return 0; 17 } 18 19 void dfs(int x,int y) 20 { 21 ch[x][y]=‘.‘; 22 for(int x1=-1;x1<=1;x1++) 23 for(int y1=-1;y1<=1;y1++) 24 { 25 int nx=x+x1,ny=y+y1; 26 if(nx>=0&&nx<N&&ny>=0&&ny<M&&ch[nx][ny]==‘W‘)//nx,ny不能超出园子 27 dfs(nx,ny); 28 } 29 return ; 30 } 31 32 void solve() 33 { 34 int a=0; 35 for(int i=0;i<N;i++) 36 for(int k=0;k<M;k++) 37 if(ch[i][k]==‘W‘) 38 { 39 dfs(i,k); 40 a++; 41 } 42 printf("%d\n",a); 43 }
此处演示5*5,5块积水的代码。
Tips:深度优先搜索DFS,从最开始出发,遍历所有可能性,对其进行操作或列举。
时间: 2024-11-03 22:17:57