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