uva_572_八连块_图论_DFS搜索
来源:互联网 发布:docking软件 编辑:程序博客网 时间:2024/06/05 13:25
传送门:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=513g
在刘汝佳的《算法艺术》第二版上看到了这道题,一早上起来拿这道题热身,AC过。
思路:
八连块,那么就是从(-1,0,1),(-1,0,1)上选取欧几里得集合后再去掉(0,0)这一点。
在找到一块‘@'后,从八个方向进行搜索,并且如果找到一块,进行标记,之后不再进行。
tips:
1.注意memset和int cnt=0的位置,确保每一次开始前都是新的。
2.没有用1和0进行标记,而是用cnt来作为每一次开始新的循环,这样就免掉了计数部分。
#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int maxn=1000;char map[maxn][maxn];int vis[maxn][maxn];int n,m;void dfs(int x,int y,int cnt){ if(x<0||x>n-1||y<0||y>m-1||map[x][y]=='*'||vis[x][y]>0) //都是不能再继续下去的标志 return; vis[x][y]=cnt; for(int i=-1;i<=1;i++) for(int j=-1;j<=1;j++) { if(!(i==0&&j==0)) dfs(x+i,y+j,cnt); }}int main(void){ int i,j,k; while(cin>>n>>m) { if(n==0&&m==0) break; int cnt=0; memset(vis,0,sizeof(vis)); for(i=0;i<n;i++) cin>>map[i]; for(i=0;i<n;i++) for(j=0;j<m;j++) { if(map[i][j]=='@'&&vis[i][j]==0) dfs(i,j,++cnt); } cout<<cnt<<endl; }}
0 0
- uva_572_八连块_图论_DFS搜索
- 洛谷 1434_滑雪_dfs
- 佳肴_纪中1420_dfs
- 砍树_纪中3079_dfs
- 洛谷 1164_小A点菜_dfs
- 洛谷 1433_吃奶酪_dfs
- SSL 2635_最小转弯问题_dfs
- 旅行_纪中2569_dfs+强连通分量
- 买汽水_纪中2948_dfs+二分查找
- 改造二叉树_纪中3894_dfs+LIS
- Controlling Companies_usaco2.3.5_dfs
- Zero Sum_usaco2.3.3_dfs
- Snail Trail_usaco 5.2_dfs
- 搜索_剪枝
- 搜索_剪枝
- SQLServer: 如何搜索%、_、[
- poj1011 _经典搜索
- 搜索_复习
- UILable 的 属性设置
- Android 编程下Touch事件的分发和消费机制
- 第四章 C++数据类型
- js弹出框、对话框、提示框、弹窗总结
- Android官方技术文档翻译——Gradle 插件用户指南(5)
- uva_572_八连块_图论_DFS搜索
- Android客户端移动流量无法登陆OpenFire服务端及长时间无响应登链接中断问题
- 第十七周项目2——引用做形参(三数排序(引用法))
- javascript中的AJAX
- 【bzoj 3339】: Rmq Problem
- Quick-cocos2d-x 环境搭建及工具选择
- shell的运行环境
- 变量声明
- Makefile重新学习