uva572 -- Oil Deposits

来源:互联网 发布:周立功单片机同类公司 编辑:程序博客网 时间:2024/05/29 13:26

题目链接

这一题是求图中连通块的个数,连通是指八连通,即上下左右和对角线共八个点,可以使用DFS或BFS来解决此题,下面给出两种方式的AC代码:
DFS代码:

#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int N=100+10;char maze[N][N];    //存储迷宫int visit[N][N];    //0未访问,1访问过int dir[8][2]={{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0}};  //八连通int m,n;    //行列数int cnt;    //连通块个数void dfs(int r,int c){    for(int i=0;i<8;i++)    {        int nextr=r+dir[i][0];        int nextc=c+dir[i][1];        if(nextr>=0&&nextr<m&&nextc>=0&&nextc<n&&maze[nextr][nextc]=='@'&&!visit[nextr][nextc])        {            visit[nextr][nextc]=1;            dfs(nextr,nextc);        }    }}int main(){    //freopen("test.txt","r",stdin);    while(cin>>m>>n&&m&&n)    {        cnt=0;        memset(maze,'\0',sizeof(maze));        memset(visit,0,sizeof(visit));        for(int i=0;i<m;i++)            scanf("%s",maze[i]);        for(int i=0;i<m;i++)            for(int j=0;j<n;j++)        {            if(maze[i][j]=='@'&&!visit[i][j])            {                dfs(i,j);                cnt++;            }        }        printf("%d\n",cnt);    }    return 0;}

BFS代码:

#include <iostream>#include <cstring>#include <cstdio>#include <queue>using namespace std;struct Node{    int r;    int c;    Node(int r,int c):r(r),c(c){}};queue<Node> q;const int N=100+10;int m,n;    //行列数char maze[N][N];    //存储迷宫int visit[N][N];    //0未访问,1访问过int dir[8][2]={{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0}};  //八连通int cnt;    //连通块个数void bfs(){    while(!q.empty())    {        Node node=q.front();        q.pop();        for(int i=0;i<8;i++)        {            int nextr=node.r+dir[i][0];            int nextc=node.c+dir[i][1];            if(nextr>=0&&nextr<m&&nextc>=0&&nextc<n&&maze[nextr][nextc]=='@'&&!visit[nextr][nextc])            {                visit[nextr][nextc]=1;                q.push(Node(nextr,nextc));            }        }    }}int main(){    //freopen("test.txt","r",stdin);    while(cin>>m>>n&&m&&n)    {        cnt=0;        memset(maze,'\0',sizeof(maze));        memset(visit,0,sizeof(visit));        for(int i=0;i<m;i++)            scanf("%s",maze[i]);        for(int i=0;i<m;i++)            for(int j=0;j<n;j++)        {            if(maze[i][j]=='@'&&!visit[i][j])            {                q.push(Node(i,j));                bfs();                cnt++;            }        }        printf("%d\n",cnt);    }    return 0;}

0 0
原创粉丝点击