uva572 -- Oil Deposits
2017-04-16 10:01
267 查看
题目链接
这一题是求图中连通块的个数,连通是指八连通,即上下左右和对角线共八个点,可以使用DFS或BFS来解决此题,下面给出两种方式的AC代码:
DFS代码:
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来解决此题,下面给出两种方式的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;
}
相关文章推荐
- UVA - 572:Oil Deposits
- Uva-572 - Oil Deposits(DFS)
- 油田(Oil Deposits, UVa 572)
- Oil Deposits - UVa 572 简单搜索
- uva572 Oil Deposits
- uva 572 Oil Deposits
- UVA572(Oil Deposits)(DFS)
- uva572--oil deposits--dfs算法
- UVa 572 Oil Deposits(DFS)
- UVa 572 Oil Deposits(DFS)
- UVA 572 - Oil Deposits
- UVA 572 Oil Deposits (DFS)
- UVA - 572 Oil Deposits(DFS和BFS两种解法)
- UVA - 572 Oil Deposits(DFS)
- uva-572 - Oil Deposits
- 【DFS】UVA - 572 Oil Deposits
- 算法竞赛入门经典 例题 6-12 油田(Oil Deposits, UVa 572)
- UVa 572 Oil Deposits(DFS求8连通块)
- UVa572 Oil Deposits(DFS)
- UVa 572 Oil Deposits