您的位置:首页 > 其它

uva572 -- Oil Deposits

2017-04-16 10:01 267 查看
题目链接

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

DFS代码:

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

const int N=100+10;
char maze

;    //存储迷宫
int visit

;    //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

; //存储迷宫
int visit

; //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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dfs bfs uva