觉得有点像并查集啦。
以前的DFS水题都是搜的四个方向,现在搜八个了。。。FT。。
感觉这个不是太像DFS。。。没有回溯塞。。。觉得就是递归。。。额。。
@的八个方向有@的并一起,输出有多少个。。额。。多少棵这样的树吧,恩,可以这么说。
#include<stdio.h> #include <stdlib.h> #include <iostream> #include <memory.h> using namespace std; int map[110][110]; int visit[110][110]; int m,n,cou; int dir[16] = { 1,0,-1,0,0,1,0,-1,1,1,1,-1,-1,1,-1,-1}; int fi,fj; int find() { for(int i=1; i<=m; i++) for(int k=1; k<=n; k++) { if(!visit[i][k] && map[i][k]) { fi = i; fj = k; return 1; } } return 0; } void DFS(int i , int j ) { visit[i][j] = 1; for(int k=0; k<16; k+=2) { int a = i+dir[k]; int b = j+dir[k+1]; if( a>=1 && a<=m && b>=1 && b<=n && map[a][b] && !visit[a][b] ) { visit[a][b] = 1; DFS(a,b); } } } int main(void) { char str[110]; while( cin >> m >> n && m ) { cou = 0; memset(visit,0,sizeof(visit)); for(int i=1; i<=m ;i++) { cin >> str; for(int k=0; k<n; k++) map[i][k+1] = (str[k] == '*'? 0 : 1); } while( find() ) { cou++; DFS(fi,fj); } cout << cou << endl; } return 0; }