Description
Input
Output
Sample Input
1 1 * 3 5 *@*@* **@** *@*@* 1 8 @@****@* 5 5 ****@ *@@*@ *@**@ @@@*@ @@**@ 0 0
Sample Output
0 1 2 2
题目大意:
@表示油所在的区域,给出一块地图,有多少块区域。可以八个方向。
解题思路:
典型的搜索题,BFS ,DFS 都可。
代码一 (BFS):
#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
#include<string>
#define N 110
using namespace std;
struct node{
int x,y;
node(int x0=0,int y0=0){//要写构造函数,不然下面用到时编译不通过.
x=x0;y=y0;
}
};
int directionX[8]={1,1,0,-1,-1,-1, 0, 1},n,m,cnt,x,y;
int directionY[8]={0,1,1, 1, 0,-1,-1,-1};
queue <node> path;
bool visited[N][N];
string map[N];
void bfs(node s){
for(int i=0;i<8;i++){
if(0<=s.x+directionX[i]&&s.x+directionX[i]<n&&0<=s.y+directionY[i]&&s.y+directionY[i]<m){
if(map[s.x+directionX[i]][s.y+directionY[i]]=='@'&&!visited[s.x+directionX[i]][s.y+directionY[i]]){
visited[s.x+directionX[i]][s.y+directionY[i]]=true;
path.push(node(s.x+directionX[i],s.y+directionY[i]));
}
}
}
path.pop();
if(path.size()>0)bfs(path.front());
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF&&(n||m)){
cnt=0;
//bool flag=false;
memset(visited,false,sizeof(visited));
while(!path.empty()) path.pop();
for(int i=0;i<n;i++) cin>>map[i];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(map[i][j]=='@'&&!visited[i][j]){
visited[i][j]=true;
path.push(node(i,j));
cnt++;
bfs(path.front());
}
}
}
printf("%d\n",cnt);
}
return 0;
}
代码二(DFS):
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#define N 110
using namespace std;
struct node{
int x,y;
node(int x0=0,int y0=0){//要写构造函数,不然下面用到时编译不通过.
x=x0;y=y0;
}
};
int directionX[8]={1,1,0,-1,-1,-1, 0, 1},n,m,cnt,x,y;
int directionY[8]={0,1,1, 1, 0,-1,-1,-1};
bool visited[N][N];
string map[N];
void dfs(node s){
for(int i=0;i<8;i++){
if(0<=s.x+directionX[i]&&s.x+directionX[i]<n&&0<=s.y+directionY[i]&&s.y+directionY[i]<m){
if(map[s.x+directionX[i]][s.y+directionY[i]]=='@'&&!visited[s.x+directionX[i]][s.y+directionY[i]]){
visited[s.x+directionX[i]][s.y+directionY[i]]=true;
dfs(node(s.x+directionX[i],s.y+directionY[i]));
}
}
}
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF&&(n||m)){
cnt=0;
memset(visited,false,sizeof(visited));
for(int i=0;i<n;i++) cin>>map[i];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(map[i][j]=='@'&&!visited[i][j]){
visited[i][j]=true;
cnt++;
dfs(node(i,j));
}
}
}
printf("%d\n",cnt);
}
return 0;
}
PKU 1562/HDU 1241 Oil Deposits(原油有多少块区域---BFS,DFS),布布扣,bubuko.com
PKU 1562/HDU 1241 Oil Deposits(原油有多少块区域---BFS,DFS)
原文地址:http://blog.csdn.net/hush_lei/article/details/38581329