11Oil Deposits
2016-04-05 20:27
197 查看
简单题意
给出一个地图,其中要么是*要么是@,对于@,横、竖、斜连着的成为一个块,问总共有多个@块
解题思路形成过程
深度优先搜索,首先找到第一个@并以他为起点深搜,直到不能搜索为止,为一个块,之后在找到下一个@,在进行深搜,直到整个地图搜索完,为了避免重复,设置一个标记地图,对进行搜索过的点进行标记。
感想
老师上课讲的思路很清楚,不过自己写出来,总有些地方考虑不周
AC代码
#include<iostream>
#include<string.h>
#include<fstream>
using namespace std;
int m,n;
bool visit[110][110];
char map[110][110];
int dir[8][2]={{-1,0},{1,0},{0,1},{0,-1},{-1,-1},{-1,1},{1,-1},{1,1}};
bool isbound(int a,int b){
if(a<1||a>m||b<1||b>n)return true;
return false;
}
void dfs(int x,int y){
for(int i=0;i<8;i++){
if(map[x+dir[i][0]][y+dir[i][1]]=='*')continue;
if(isbound(x+dir[i][0],y+dir[i][1]))continue;
if(visit[x+dir[i][0]][y+dir[i][1]])continue;
visit[x+dir[i][0]][y+dir[i][1]]=1;
dfs(x+dir[i][0],y+dir[i][1]);
}
}
int main()
{
ifstream cin("in.txt");
while(cin>>m>>n&&m&&n){
memset(visit,0,sizeof(visit));
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cin>>map[i][j];
}
}
int sum=0;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(map[i][j]=='@'&&!visit[i][j]){
visit[i][j]=1;
dfs(i,j);//¶Ô´ËµãÉîËÑ
sum++;
}
}
}
cout<<sum<<endl;
}
return 0;
}
给出一个地图,其中要么是*要么是@,对于@,横、竖、斜连着的成为一个块,问总共有多个@块
解题思路形成过程
深度优先搜索,首先找到第一个@并以他为起点深搜,直到不能搜索为止,为一个块,之后在找到下一个@,在进行深搜,直到整个地图搜索完,为了避免重复,设置一个标记地图,对进行搜索过的点进行标记。
感想
老师上课讲的思路很清楚,不过自己写出来,总有些地方考虑不周
AC代码
#include<iostream>
#include<string.h>
#include<fstream>
using namespace std;
int m,n;
bool visit[110][110];
char map[110][110];
int dir[8][2]={{-1,0},{1,0},{0,1},{0,-1},{-1,-1},{-1,1},{1,-1},{1,1}};
bool isbound(int a,int b){
if(a<1||a>m||b<1||b>n)return true;
return false;
}
void dfs(int x,int y){
for(int i=0;i<8;i++){
if(map[x+dir[i][0]][y+dir[i][1]]=='*')continue;
if(isbound(x+dir[i][0],y+dir[i][1]))continue;
if(visit[x+dir[i][0]][y+dir[i][1]])continue;
visit[x+dir[i][0]][y+dir[i][1]]=1;
dfs(x+dir[i][0],y+dir[i][1]);
}
}
int main()
{
ifstream cin("in.txt");
while(cin>>m>>n&&m&&n){
memset(visit,0,sizeof(visit));
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cin>>map[i][j];
}
}
int sum=0;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(map[i][j]=='@'&&!visit[i][j]){
visit[i][j]=1;
dfs(i,j);//¶Ô´ËµãÉîËÑ
sum++;
}
}
}
cout<<sum<<endl;
}
return 0;
}
相关文章推荐
- C 语言实现迷宫 DFS算法
- 图的基本算法
- 程序设计实习MOOC/第十五周编程作业/A:棋盘问题
- LeetCode#337. House Robber III
- 深度优先搜索(POJ1164 城堡问题)
- 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)
- hdu 2614 Beat
- hdu 1501 Zipper 拉链
- hdu 1175 连连看 经典dfs
- Oil Deposits(深度或广度搜索)
- HDU 4536 XCOM Enemy Unknown
- HDU 1241 Oil Deposits
- HDU 1518 Square
- HDU 1016 Prime Ring Problem
- HDU 1312 Red and Black
- 旅行商问题(深度优先搜索 回溯法 排列树)
- 图的m着色问题(回溯法-满m叉树)
- 最小机器重量设计问题(回溯法-满m叉树)
- POJ1321,深度优先搜索
- 深度优先搜索