poj1562 DFS/BFS连通块

来源:互联网 发布:centos服务器测速 编辑:程序博客网 时间:2024/04/29 23:32
#include <iostream>#include <queue>#include <cstring>#include <cstdio>#include <vector>#define sf scanf#define pf printf#define mem(vis,a) memset(visit,a,sizeof(visit));using namespace std;char g[100][100];int n,m;int dir[8][2]={{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};int visit[100][100];void dfs(int x,int y){    for(int i=0;i<8;i++)    {        int nx,ny;        nx=x+dir[i][0];        ny=y+dir[i][1];        if(nx<n&&nx>=0&&ny<m&&ny>=0&&g[nx][ny]=='@'&&!visit[nx][ny])        {            visit[nx][ny]=1;            dfs(nx,ny);        }    }}int main(){    while(cin>>n>>m&&(n+m))    {        mem(visit,0);        for(int i=0;i<n;i++)            for(int j=0;j<m;j++)            cin>>g[i][j];        int ans=0;        for(int i=0;i<n;i++)            for(int j=0;j<m;j++)            {                if(g[i][j]=='@'&&!visit[i][j])                {                    visit[i][j]=1;                    dfs(i,j);                    ++ans;                }            }        cout<<ans<<endl;    }}

#include <iostream>//BFS#include <queue>#include <cstring>#include <cstdio>#include <vector>#define sf scanf#define pf printf#define mem(vis,a) memset(visit,a,sizeof(visit));using namespace std;struct point{    int x;    int y;point(){}    point(int x,int y){this->x=x;this->y=y;}};char g[100][100];int n,m;int dir[8][2]={{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};int visit[100][100];void bfs(int x,int y){    queue<point>Q;    Q.push(point(x,y));    visit[x][y]=1;    while(!Q.empty())    {        point np=Q.front();        Q.pop();        for(int i=0;i<8;i++)        {            int nx,ny;            nx=np.x+dir[i][0];            ny=np.y+dir[i][1];            if(nx<n&&nx>=0&&ny<m&&ny>=0&&g[nx][ny]=='@'&&!visit[nx][ny])            {                visit[nx][ny]=1;                Q.push(point(nx,ny));            }        }    }}int main(){    while(cin>>n>>m&&(n+m))    {        mem(visit,0);        for(int i=0;i<n;i++)            for(int j=0;j<m;j++)            cin>>g[i][j];        int ans=0;        for(int i=0;i<n;i++)            for(int j=0;j<m;j++)            {                if(g[i][j]=='@'&&!visit[i][j])                {                    bfs(i,j);                    ++ans;                }            }        cout<<ans<<endl;    }    return 0;}

0 0