以前做过的求联通块问题。这里主要有两点
1.渐渐出来一个板子,即
①判出
②循环方向
①剪枝(越界,或者已经遍历过)
②判断是否可走
进行下一步dfs或者bfs
2.运行时间31ms,和网上的15ms有区别。我觉得主要是init函数花费较多时间。但是这样的模块化让代码可读性更高了。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int dir[8][2]={{1,1},{1,0},{1,-1},{0,1},{0,-1},{-1,1},{-1,0},{-1,-1,}};
int idx[105][105];
bool mp[105][105];
int m,n;
bool init(){
memset(idx,0,sizeof(idx));
memset(mp,false,sizeof(mp));
scanf("%d %d",&m,&n);
if(!m&&!n) return false;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
char c;
cin>>c;
if(c=='@'){
mp[i][j]=true;
}
}
}
return true;
}
void dfs(int r,int c,int id){
idx[r][c]=id;
for(int i=0;i<8;i++){
int tr=r+dir[i][0];
int tc=c+dir[i][1];
if(tr<0||tr>=m||tc<0||tc>=n) continue;
if(idx[tr][tc]) continue;
if(mp[tr][tc]){
dfs(tr,tc,id);
}
}
}
int main(void){
while(init()){
int id=0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(mp[i][j]&&!idx[i][j]){
dfs(i,j,++id);
}
}
}
printf("%d\n",id);
}
}