求图中环的个数
简单dfs
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int vis[110][110];
int vis1[110][110];
char mp[110][110];
int c[16][2] = {1, 0, -1, 0, 0, 1, 0, -1, 1, 1, 1, -1, -1, 1, -1, -1};
int x1, x2;
int n, m;
int sum = 0;
int judge(int x, int y){
if(x >= 0 && x <= n - 1 && y >= 0 && y <= m - 1)return 1;
return 0;
}
void dfs(int x, int y, int ans){
int flag = 0;
for(int i = 0; i <= 7; i++){
int xx = x + c[i][0];
int yy = y + c[i][1];
if(judge(xx, yy) && mp[xx][yy] == '#' && !vis[xx][yy] && !vis1[xx][yy]){
vis[xx][yy] = 1;
vis1[xx][yy] = 1;
dfs(xx, yy, ans + 1);
vis[xx][yy] = 0;
flag = 1;
}
}
if(!flag && ans > 1)
for(int i = 0; i <= 7; i++){
int xx = x + c[i][0];
int yy = y + c[i][1];
if(xx == x1 && yy == x2){
sum++;
return;
}
}
}
int main(){
while(scanf("%d %d", &n, &m) == 2){
for(int i = 0; i <= n - 1; i++){
scanf(" %s", mp[i]);
}
sum = 0;
memset(vis1, 0, sizeof(vis1));
for(int i = 0; i <= n - 1; i++){
for(int j = 0; j <= m - 1; j++){
memset(vis, 0, sizeof(vis));
if(!vis[i][j] && mp[i][j] == '#'){
vis[i][j] = 1;
vis1[i][j] = 1;
x1 = i;
x2 = j;
dfs(i, j, 1);
}
}
}
printf("%d\n", sum);
}
return 0;
}