poj 1562 ,hdu 1241 Oil Deposits dfs,bfs 求连通分支数
题目地址: http://poj.org/problem?id=1562 http://acm.hdu.edu.cn/showproblem.php?pid=1241
直接遍历求连通分支数, dfs方法:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int map[105][105]; int vis[105][105]; int n,m; void dfs(int x,int y) { //cout<<x<<' '<<y<<endl; vis[x][y]=1; if(x+1<n&&y<m&&!vis[x+1][y]&&map[x+1][y]) dfs(x+1,y); if(x<n&&y+1<m&&!vis[x][y+1]&&map[x][y+1]) dfs(x,y+1); if(x+1<n&&y+1<m&&!vis[x+1][y+1]&&map[x+1][y+1]) dfs(x+1,y+1); if(x-1>=0&&y<m&&!vis[x-1][y]&&map[x-1][y]) dfs(x-1,y); if(x<n&&y-1>=0&&!vis[x][y-1]&&map[x][y-1]) dfs(x,y-1); if(x-1>=0&&y-1>=0&&!vis[x-1][y-1]&&map[x-1][y-1]) dfs(x-1,y-1); if(x-1>=0&&y+1<m&&!vis[x-1][y+1]&&map[x-1][y+1]) dfs(x-1,y+1); if(x+1<n&&y-1>=0&&!vis[x+1][y-1]&&map[x+1][y-1]) dfs(x+1,y-1); } void init() { memset(vis,0,sizeof(vis)); } int main() { char ch; while(cin>>n>>m) { if(n==0&&m==0) break; init(); for(int i=0;i<n;i++) for(int j=0;j<m;j++) { //scanf("%c",&ch); cin>>ch; if(ch=='*') map[i][j]=0; else map[i][j]=1; } int count=0; for(int i=0;i<n;i++) for(int j=0;j<m;j++) { if(!vis[i][j]&&map[i][j]) {dfs(i,j);count++;} } cout<<count<<endl; } }
bfs 方法:
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; int map[105][105]; int vis[105][105]; int n,m; struct node { int a; int b; }; queue<node> q; void bfs(node x) { q.push(x); while(q.empty()==false) { node cur=q.front(); q.pop(); int x=cur.a; int y=cur.b; vis[x][y]=1; if(x+1<n&&y<m&&!vis[x+1][y]&&map[x+1][y]) { node newnode; newnode.a=x+1; newnode.b=y; q.push(newnode); } if(x<n&&y+1<m&&!vis[x][y+1]&&map[x][y+1]) { node newnode; newnode.a=x; newnode.b=y+1; q.push(newnode); } if(x+1<n&&y+1<m&&!vis[x+1][y+1]&&map[x+1][y+1]) { node newnode; newnode.a=x+1; newnode.b=y+1; q.push(newnode); } if(x-1>=0&&y<m&&!vis[x-1][y]&&map[x-1][y]) { node newnode; newnode.a=x-1; newnode.b=y; q.push(newnode); } if(x<n&&y-1>=0&&!vis[x][y-1]&&map[x][y-1]) { node newnode; newnode.a=x; newnode.b=y-1; q.push(newnode); } if(x-1>=0&&y-1>=0&&!vis[x-1][y-1]&&map[x-1][y-1]) { node newnode; newnode.a=x-1; newnode.b=y-1; q.push(newnode); } if(x-1>=0&&y+1<m&&!vis[x-1][y+1]&&map[x-1][y+1]) { node newnode; newnode.a=x-1; newnode.b=y+1; q.push(newnode); } if(x+1<n&&y-1>=0&&!vis[x+1][y-1]&&map[x+1][y-1]) { node newnode; newnode.a=x+1; newnode.b=y-1; q.push(newnode); } } } void init() { memset(vis,0,sizeof(vis)); } int main() { char ch; while(cin>>n>>m) { if(n==0&&m==0) break; init(); for(int i=0;i<n;i++) for(int j=0;j<m;j++) { //scanf("%c",&ch); cin>>ch; if(ch=='*') map[i][j]=0; else map[i][j]=1; } int count=0; for(int i=0;i<n;i++) for(int j=0;j<m;j++) { if(!vis[i][j]&&map[i][j]) { node cur; cur.a=i; cur.b=j; bfs(cur); count++; } } cout<<count<<endl; } }
相比起来 这里用dfs更合适
posted on 2013-09-26 00:35 814jingqi的ACM 阅读(199) 评论(0) 编辑 收藏 举报