問題描述:ios
有個大小爲N*M的園子,雨後積起了水。八連通的積水被認爲是鏈接在一塊兒的。求出園子裏總共有多少水窪。spa
N, M <= 100code
輸入例:blog
:遞歸
問題分析:ci
八連通即:上、左上、左,左下,下,右下,右,右上。io
這道題能夠用深刻優先搜索(DFS)的思想。class
1. 尋找是水窪的點。若是找到,標記此點已經記過。stream
循環此點的八連通,若是是水,遞歸循環搜索
2. 尋找的次數即爲水窪數。
代碼:
# include <iostream> # include <fstream> using namespace std; int N, M; char map[100][100]; void DFS_Search(int i, int j) { map[i][j] = '.'; //這樣搞定八循環的方式很是棒!!! for ( int dx = -1; dx <= 1; dx++) { for ( int dy = -1; dy <= 1; dy++) { int x = i + dx; int y = j + dy; if ( x >= 0 && x <= N && y >= 0 && y <= M && map[x][y] == 'W') DFS_Search(x, y); } } } int main() { int count = 0; // ifstream cin("Lake_Counting_Data.txt"); cin>>N>>M; for( int i = 0; i < N; i++) { for ( int j = 0; j < M; j++) { cin>>map[i][j]; } } for( int i = 0; i < N; i++) { for ( int j = 0; j < M; j++) { if ( map[i][j] == 'W' ) { count++; DFS_Search(i, j); } } } cout<<count<<endl; return 0; }