poj1562
来源:互联网 发布:win10怎么安装软件 编辑:程序博客网 时间:2024/06/05 19:07
#include<stdlib.h>#include<string.h>#include<stdio.h>#include<math.h>int m,n;char map[110][110];int num;int dir[8][2] ={{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};//这是一种坐标移动办法/*还有另外一种,这样也是可以的,但我觉得用数组把坐标移动方式记录下来,这样方便一点 DFS(p - 1, q - 1); DFS(p - 1, q); DFS(p - 1, q + 1); DFS(p, q - 1); DFS(p, q + 1); DFS(p + 1, q - 1); DFS(p + 1, q); DFS(p + 1, q + 1); 第三种是吧x和y的移动的坐标 分开写,比如这样int movex[8]={1,1,1,-1,-1,-1,0,0},movey[8]={1,0,-1,1,0,-1,1,-1}; } */ void Dfs(int t,int u){int i,a,b;map[t][u] = '*';for( i = 0 ; i < 8 ; i ++){a = t + dir[i][0]; //x 坐标的移动 b = u + dir[i][1]; //y 坐标的移动 if(( a >= 0)&& (a < m) && (b >= 0) && (b < n)&&map[a][b] == '@'){Dfs(a,b);}}}int main(){int i , j ;while(scanf("%d%d",&m,&n) && m ){num = 0;memset(map,0,sizeof(map));for(i = 0 ; i < m ; i ++){scanf("%s",map[i]);}for( i = 0 ; i < m ; i ++){for(j = 0; j < n ; j ++){if(map[i][j] == '@'){num++;Dfs(i,j);}}}printf("%d\n",num);} return 0;}
第二种完整的代码:
#include <stdio.h>#include <string.h>#define MAXN 100 + 10char graph[MAXN][MAXN];int count;int m, n;void DFS(int p, int q);int main(){ int i, j; while(scanf("%d%d", &m, &n) && m != 0) { // 初始化 count = 0; memset(graph, 0, sizeof(graph)); // 数据输入 for(i = 0; i < m; i++) { for(j = 0; j < n; j++) { scanf("\n%c", &graph[i][j]); } } // 算法主体 for(i = 0; i < m; i++) for(j = 0; j < n; j++) if(graph[i][j] == '@') { DFS(i, j); count++; } // 数据输出 printf("%d\n", count); } return 0;}void DFS(int p, int q){ if(p >= 0 && p <= m - 1 && q >= 0 && q <= n - 1 && graph[p][q] == '@') { graph[p][q] = '*';//把遍历过的 @ 变成 * 防止遍历其他的点的时候,误判 } else { return; } //第二种的便利八个方向上的点,就是直接移动,没有调数组 DFS(p - 1, q - 1); DFS(p - 1, q); DFS(p - 1, q + 1); DFS(p, q - 1); DFS(p, q + 1); DFS(p + 1, q - 1); DFS(p + 1, q); DFS(p + 1, q + 1);}
第三种呢就是把x的移动存为一个数组,把Y的移动存为一个数组
下面是代码
//这个是第三种啦#include<cstdio>#include<cstring>#include<iostream>#define MAX 101using namespace std;int n,m,ans;char map[MAX][MAX];bool vis[MAX][MAX];int movex[8]={1,1,1,-1,-1,-1,0,0},movey[8]={1,0,-1,1,0,-1,1,-1};bool isborder(int x,int y){ if(x<0||x>=n||y<0||y>=m)return true; return false;}void DFS(int x,int y){ if(isborder(x,y)||map[x][y]=='*')return; for(int i=0;i<8;i++) {int itx=x+movex[i];int ity=y+movey[i];if(isborder(itx,ity)||vis[itx][ity]) continue;vis[itx][ity]=1;if(map[itx][ity]=='@') DFS(itx,ity); }}int main(){ while(scanf("%d%d",&n,&m)&&(n||m)) {for(int i=0;i<n;i++) scanf("%s",&map[i]);memset(vis,0,sizeof(vis));ans=0;for(int i=0;i<n;i++) for(int j=0;j<m;j++)if(!vis[i][j]&&map[i][j]!='*'){ DFS(i,j); ans++;}printf("%d\n",ans); } return 0;}
其实我觉得这三种都是差不多的,反正你自己开心就好,另外还有人用的是bfs做出来的,bfs现在暂时还没研究~
0 0
- poj1562
- poj1562
- poj1562
- poj1562
- POJ1562
- poj1562
- poj1562--DFS
- poj1562 poj1088
- POJ1562 dfs水题
- 北大ACM poj1562
- POJ1562:Oil Deposits(DFS)
- poj1562(八个方向dfs)
- poj1562 Oil Deposits
- poj1562 Oil Deposits
- Oil Deposits POJ1562
- poj1562 Oil Deposits BFS
- poj1562 Oil Deposits(DFS)
- POJ1562.Oil Deposits
- Fragment的两个子类ListFragment和DialogFragment的应用Demo
- BestCoder Round #64 (div.2) HDOJ5587 Array(dfs)
- 二叉搜索树 HDU 3791
- iOS开发常见问题(二)
- Windows 7 & Windows 8 简体中文旗舰版下载地址
- poj1562
- WebKit之JS内嵌C++对象
- StatePattern-HeadFirst学习
- 解决UIWebView 前进、后退刷新的坑
- 黑马程序员__Java接口定义
- C++ STL 学习 :for_each与仿函数(functor)
- 欢迎使用CSDN-markdown编辑器
- Longest Valid Parentheses
- WebKit之jsc和webcore的交互