今天看了下搜索,于是找了一道DFS题来做,看过别人代码后,自己写了一下,一次AC,也可用BFS……看了一下Discuss,发现还可以用并查集来做……
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 12143 | Accepted: 6228 |
Description
Input
Output
Sample Input
10 12
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.
Sample Output
3
思路很简单,就是从第一个位置开始,深度遍历周围八个位置,注意标记访问过的存在水的位置
#include<stdio.h> int N, M; char map[101][101]; int visited[101][101]={0}; void DFS(int i, int j) { if( (i<=0||i>=N+1) || (j<=0|| j>=M+1) || map[i][j]=='.' || visited[i][j] )//越界,或不存在水,或已访问过 return; visited[i][j]=1;//标记 DFS(i-1, j); DFS(i+1, j); DFS(i, j-1); DFS(i, j+1); DFS(i-1, j-1); DFS(i+1, j-1); DFS(i-1, j+1); DFS(i+1, j+1); } int main() { int i, j, k, l; int num=0; scanf("%d %d", &N, &M); for(i=1; i<=N; i++) { getchar();//接受换行符 for(j=1; j<=M; j++) { scanf("%c",&map[i][j]); // cin>>map[i][j]; } } for(i=1; i<=N; i++) for(j=1; j<=M; j++) { if(!visited[i][j] && map[i][j]=='W')//有水,且未访问过 { num++; DFS(i, j); } } printf("%d\n", num); }