这道题其实是一个图的遍历,就是看几次能把图遍历完全,刚开始我考虑到用深度优先遍历,而因为图是用邻接矩阵存储的要求当前遍历结点的下一个访问的结点有点麻烦,所以,结合题意“相邻”,所以只要以当前结点为圆心访问其一周,就可以知道是不是在同一个包里了,比深度优先方便了很多,可以实现题目的要求
失误1:没看清题目要求,数组定义过小;
失误2:遍历一周的节点的数组没写好一开始
#include <cstdio> #include <cstring> #define MAX 100+2 int in[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}}; char s[MAX] ; int date[MAX][MAX]; bool visit[MAX][MAX]; void sm(int r , int t) { int i ; if(visit[r][t] || !date[r][t]) { return ; } visit[r][t] = true ; for(i = 0 ; i < 8 ; i ++) { sm(r+in[i][0] , t+in[i][1]); } } int main() { int m , n , i , j , count; while(scanf("%d%d",&n , &m) == 2 && n && m ) { memset(date,0,sizeof(date)); memset(visit,0,sizeof(visit)); for( i = 1 ; i <= n ; i ++ ) { scanf("%s",s); for( j = 1 ; j <= m ; j ++) { if(s[j-1] == '@') date[i][j] = 1 ; } } for( i = 1, count = 0 ; i <= n ; i ++) { for( j = 1 ; j <= m ; j ++) { if(!visit[i][j] && date[i][j]) { sm(i , j); count ++ ; } } } printf("%d\n",count); } return 0 ; }