首页 > 代码库 > hdu1241 dfs
hdu1241 dfs
链接改天再补 杭电又崩了。。。
题意:求“@”组成了多少个联通区域,每个点的8个方向都认为是相连的
思路:对每一个点进行搜索 当Map == @ && vis == 0 时 可进入搜索 每次进入搜索时 ans++ 搜索时将该联通区域所有的点标记 8个方向搜
AC代码:
1 #include "iostream" 2 #include "string.h" 3 #include "stack" 4 #include "queue" 5 #include "map" 6 #include "algorithm" 7 #include "stdio.h" 8 #include "math.h" 9 #define ll long long10 #define mem(a) memset(a,0,sizeof(a))11 #define max(a,b) a > b ? a : b12 #define min(a,b) a < b ? a : b13 14 using namespace std;15 16 int d[8][2] = {{0,1},{1,0},{0,-1},{-1,0},{-1,1},{1,1},{1,-1},{-1,-1}};17 bool vis[1005][1005];18 bool Map[1005][1005];19 20 struct Node21 {22 int xx,yy;23 };24 25 void Dfs(int x,int y)26 {27 stack<Node>S;28 Node now,next;29 now.xx = x;30 now.yy = y;31 vis[x][y] = 1;32 S.push(now);33 34 while(!S.empty())35 {36 now = S.top();37 S.pop();38 39 for(int i=0; i<8; i++)40 {41 next.xx = now.xx + d[i][0];42 next.yy = now.yy + d[i][1];43 44 if(Map[next.xx][next.yy] && !vis[next.xx][next.yy])45 {46 vis[next.xx][next.yy] = 1;47 S.push(next);48 }49 }50 }51 }52 53 int main()54 {55 int n,m,i,j,ans;56 char c;57 while(scanf("%d%d",&m,&n)&&(m||n))58 {59 mem(vis);60 mem(Map);61 ans = 0;62 for(i=1; i<=m; i++)63 for(j=1; j<=n; j++)64 {65 cin>>c;66 if(c==‘@‘)67 Map[i][j] = 1;68 if(c==‘*‘)69 Map[i][j] = 0;70 }71 for(i=1; i<=m; i++)72 for(j=1; j<=n; j++)73 {74 if(Map[i][j] && !vis[i][j])75 {76 ans++;77 Dfs(i,j);78 }79 }80 printf("%d\n",ans);81 }82 return 0;83 }
hdu1241 dfs
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。