PKU 1562
2014-03-27 14:27
162 查看
#include<iostream> #include<fstream> #include<stdio.h> #include<string.h> using namespace std; int map[100][100],vis[100][100],n,m; char c; int add[8][2]={{0,-1},{0,1},{-1,0},{1,0},{-1,-1},{1,-1},{-1,1},{1,1}};//用这个数组来一次遍历各个坐标的上,下,左,右,左上,左下,右上,右下的8个点 int ma; void dfs(int x,int y) { int i,j,x_x,y_y; //vis[x][y]=1; for(i=0;i<8;i++) { x_x=x+add[i][0]; y_y=y+add[i][1]; if(x_x>=0&&x_x<n&&y_y>=0&&y_y<m&&map[x_x][y_y]&&!vis[x_x][y_y])//对只满足条件的点进行相应的操作 { //ma++; //vis[x][y]=1; vis[x_x][y_y]=1; //对已经访问过的点进行标记,防止再次访问,即在对一个点的8个方向的点遍历时,减少不必要的操作 dfs(x_x,y_y); //对i,j坐标上的点的8个方向上的点进行遍历 } } return ; } int main() { //ifstream cin("data.txt"); freopen("data.txt","r",stdin); int i,j; //while(cin>>n>>m&&m&&n) while(scanf("%d%d",&n,&m)&&n) { ma=0; memset(vis,0,sizeof(vis)); for(i=0;i<n;i++) //两个for()循环的作用是,对n行,m列的各个坐标元素依次进行搜索的操作,直道遍历完毕后得出正确的结果 for(j=0;j<m;j++) { cin>>c; if(c=='@') map[i][j]=1; //对有oil deposits的地方进行标记以此区分其它坐标点,使遍历或者搜索更加简洁,快速 else map[i][j]=0; } for(i=0;i<n;i++) for(j=0;j<m;j++) { if(map[i][j]&&!vis[i][j]) //通过对在dfs()中已经做了标记的元素进行相应的操作,在这个循环里只需要找出满足条件的坐标点即可,在这里搜索出所要的答案 { ma++; dfs(i,j); } } cout<<ma<<endl; } return 0; }
相关文章推荐
- DFS PKU 1562
- Oil Deposits pku 1562
- PKU 1562 Oil Deposit
- pku 1562 Oil Deposits(典型的BFS)
- DFS PKU 1562
- pku/poj 1562
- pku1562 Oil Deposits 油田合并(简单深搜)
- PKU 1562/HDU 1241 Oil Deposits(原油有多少块区域---BFS,DFS)
- pku 1562 Oil Deposits---dfs
- pku3090&&pku2478
- pku 1521 赫夫曼编码 Entropy 解题报告
- PKU搜索题--part1
- pku 2362 Square
- pku 3191 The Moronic Cowmpouter
- pku 1679 次最小生成树
- PKU 1094 Sorting It All Out
- pku2947 Widget Factory
- pku 3259(最短路径,spfa)
- PKU ACM 1004
- 编程练习平台 ACM PKU JudgeOnline