题目地址: 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更合适