贴上代码,此题每个点只能访问一次,所以需要设置一个vis[],来判断每个点是否被访问过
//宽度优先遍历 #include<cstdio> #include<string> #include<iostream> #include<ctime> #include<queue> #include<cstring> using namespace std; int row,col; char map[105][105]; char vis[105][105]; int cnt = 0; //typedef pair<int,int>PII; bool in_map(int r,int c) { if(r<row&&r>=0&&c>=0&&c<col) return true; return false; } int num=0; int dr[] = {-1,-1,-1,0,0,1,1,1}; int dc[] = {-1,0,1,-1,1,-1,0,1}; void dfs(int r, int c) { vis[r][c] = cnt; for(int i = 0; i<8;i++) { if(in_map(r+dr[i],c+dc[i])&&!vis[r+dr[i]][c+dc[i]]&&map[r+dr[i]][c+dc[i]]=='@') dfs(r+dr[i],c+dc[i]); } } void print_map() { for(int i=0;i<row;i++) { for(int j=0;j<col;j++) { printf("%c",map[i][j]); } printf("\n"); } printf("\n"); } int main() { #ifdef local freopen("input.txt","r",stdin); freopen("out.txt","w",stdout); #endif while(scanf("%d%d",&row,&col)==2&&row&&col) { memset(vis,0,sizeof(vis)); cnt = 0; for(int i=0;i<row;i++) { scanf("%s", map[i]); } //print_map(); for(int i=0;i<row;i++) { for(int j=0;j<col;j++) { if(!vis[i][j]&&map[i][j]=='@') { cnt++; dfs(i,j); } } } //print_map(); printf("%d\n",cnt); } return 0; }