挑战程序2.1.4 穷竭搜索>>深度优先搜索
深度优先搜索DFS,从最开始状态出发,遍历一种状态到底,再回溯搜索第二种。
题目:POJ2386
/* input: 7 7 ..#.#.. ..#.#.. ###.### ...@... ###.### ..#.#.. ..#.#.. 表示有13个可以走到的地方(包括原来那一格)。*/ #include <stdio.h> ][]; void solve(int H,int W); void find1(int H,int W); void dfs(int x,int y,int H,int W); int main() { int H,W,i; &&W!=) { getchar(); ;i<H;i++) gets(ch[i]); find1(H,W); solve(H,W); } ; } void solve(int H,int W) { ; ;i<H;i++) ;k<W;k++) if(ch[i][k]=='@') a++; printf("%d\n",a); } void find1(int H,int W) { ;i<H;i++) ;k<W;k++) if(ch[i][k]=='@') { dfs(i,k,H,W); return; } } void dfs(int x,int y,int H,int W) { int x1,y1,nx,ny; ch[x][y]='@'; ;x1<=;x1++) { nx=x+x1; &&nx<H&&ch[nx][y]!='#'&&ch[nx][y]!='@') dfs(nx,y,H,W); } ;y1<=;y1++) { ny=y+y1; &&ny<W&&ch[x][ny]!='#'&&ch[x][ny]!='@') dfs(x,ny,H,W); } return; }
POJ2386
练习题系列………………………………………………………
#include <stdio.h> ][]; void solve(int H,int W); void find1(int H,int W); void dfs(int x,int y,int H,int W); int main() { int H,W,i; &&W!=) { getchar(); ;i<H;i++) gets(ch[i]); find1(H,W); solve(H,W); } ; } void solve(int H,int W)//计数 { ; ;i<H;i++) ;k<W;k++) if(ch[i][k]=='@') a++; printf("%d\n",a); } void find1(int H,int W)//找到点 { ;i<H;i++) ;k<W;k++) if(ch[i][k]=='@') { dfs(i,k,H,W); return; } } void dfs(int x,int y,int H,int W) { int x1,y1,nx,ny; ch[x][y]='@'; ;x1<=;x1++) { nx=x+x1; &&nx<H&&ch[nx][y]!='#'&&ch[nx][y]!='@') dfs(nx,y,H,W); } ;y1<=;y1++) { ny=y+y1; &&ny<W&&ch[x][ny]!='#'&&ch[x][ny]!='@') dfs(x,ny,H,W); } return; }
POJ1979
#include <stdio.h> #include <iostream> using namespace std; ][]; ]={,,,-}; ]={,,-,}; int H,W,cou; void DFS(int x, int y){ ; char b=ch[x][y]; ch[x][y]='.'; ; i < ; i++) { int xn = x + xx[i], yn = y + yy[i]; && xn < W && yn >= && yn < H && ch[xn][yn] == b) { DFS(xn, yn); } } return ; } int main() { while(cin >> W >> H && (H && W)) { cou = ; ; i < W; i++) ; k < H; k++) cin >> ch[i][k]; ; i < W; i++) ; k < H; k++) if(ch[i][k] != '.') { DFS(i, k); cou++; } cout << cou << endl; } ; }
AOJ0033
题目:POJ3009
这题撸了很久。
#include <iostream> #include <string.h> #include <algorithm> using namespace std; ]={ , , -, }; ]={ , , , -}; ][]; int xn,yn,x1,y1,H,W,y2,x2,a; void dfs(int x1, int y1, int step){ ) return ; ; i < ; i++){//四个方向 int xn = x1 + dx[i], yn = y1 + dy[i]; if(xn == x2 && yn == y2){ a=min(a, step + ); continue; } )continue; && xn < W && yn >= && yn < H){ xn += dx[i]; yn += dy[i];//继续往下面走 && xn < W && yn >= && yn < H) { ) continue;//直到撞墙或终点 if(xn == x2 && yn == y2){//到达终点 a= min(a, step + ); return ; } map1[xn][yn] = ;//停下来了,继续dfs,注意dfs前后面的墙。 dfs(xn - dx[i], yn - dy[i], step + ); map1[xn][yn] = ; break; } } } return ; } int main() { && W != ){ ; i < W; i++) ; k < H; k++){ cin >> map1[i][k]; ){ x1 = i; y1 = k; map1[i][k] = ; } ){ x2 = i; y2 = k; map1[i][k] = ; } } a = ; dfs(x1, y1, ); || a>) cout << "-1" << endl; else cout << a <<endl; } ; }
POJ3009
挑战程序2.1.4 穷竭搜索>>深度优先搜索的更多相关文章
- 挑战程序2.1.5 穷竭搜索>>宽度优先搜索
先对比一下DFS和BFS 深度优先搜索DFS 宽度优先搜索BFS 明显可以看出搜索顺序不同. DFS是搜索单条路径到 ...
- 常用算法2 - 广度优先搜索 & 深度优先搜索 (python实现)
1. 图 定义:图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合. 简单点的说:图由节点和边组成.一 ...
- 搜索——深度优先搜索(DFS)
设想我们现在身处一个巨大的迷宫中,我们只能自己想办法走出去,下面是一种看上去很盲目但实际上会很有效的方法. 以当前所在位置为起点,沿着一条路向前走,当碰到岔道口时,选择其中一个岔路前进.如果选择的这个 ...
- 【数据结构与算法Python版学习笔记】图——骑士周游问题 深度优先搜索
骑士周游问题 概念 在一个国际象棋棋盘上, 一个棋子"马"(骑士) , 按照"马走日"的规则, 从一个格子出发, 要走遍所有棋盘格恰好一次.把一个这样的走棋序列 ...
- python实现广度优先搜索和深度优先搜索
图的概念 图表示的是多点之间的连接关系,由节点和边组成.类型分为有向图,无向图,加权图等,任何问题只要能抽象为图,那么就可以应用相应的图算法. 用字典来表示图 这里我们以有向图举例,有向图的邻居节点是 ...
- 《挑战程序设计竞赛》2.1 穷竭搜索 POJ2718 POJ3187 POJ3050 AOJ0525
POJ2718 Smallest Difference Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6509 Acce ...
- 《挑战程序设计竞赛》2.1 深度优先搜索 POJ2386 POJ1979 AOJ0118 AOJ0033 POJ3009
POJ2386 Lake Counting Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 25366 Accepted: ...
- matlab练习程序(广度优先搜索BFS、深度优先搜索DFS)
如此经典的算法竟一直没有单独的实现过,真是遗憾啊. 广度优先搜索在过去实现的二值图像连通区域标记和prim最小生成树算法时已经无意识的用到了,深度优先搜索倒是没用过. 这次单独的将两个算法实现出来,因 ...
- 深度优先搜索(dfs)与出题感想
在3月23号的广度优先搜索(bfs)博客里,我有提到写一篇深搜博客,今天来把这个坑填上. 第一部分:深度优先搜索(dfs) 以上来自百度百科. 简单来说,深度优先搜索算法就是——穷举法,即枚举所有情况 ...
随机推荐
- 转: git复制到非空目录
1. 进入非空目录,假设是 /workdir/proj1 2. git clone --no-checkout https://domain_or_ip/source.git tmp 3. mv tm ...
- C++笔记----构造函数与析构函数(三)
1.构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 构造函数的执行分为两个阶段:初始化段. 普通计算段 2.对象成员及其初始化 #include<iostream> using ...
- Java 多线程之单例设计模式
转载:https://segmentfault.com/a/1190000007504892 概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍两种:懒汉式单例.饿汉 ...
- 使用HttpClient连接池进行https单双向验证
https单双向验证环境的搭建参见:http://www.cnblogs.com/YDDMAX/p/5368404.html 一.单向握手 示例程序: package com.ydd.study.he ...
- 选择App开发外包时,你该了解哪些法律常识?
随着App需求的激增,选择App外包服务的客户也多了起来.然而客户和开发方对于其中的法律条款却不甚了解,导致在服务过程中,时常会发生一些分歧和纠纷,最终致使项目搁浅. 为了普及App外包的法律常识,移 ...
- 可爱的Python_课后习题_CDay0 时刻准备着!发布
请根据软件发布的流程和软件开发的编码规范,将读者在前面章节所写的程序修改并发 布出去.另外,可以查找下除了 epydoc 外还有哪些较好的 py 文档生成器? pydoc是Python自带的模块,主要 ...
- 如何用jenkins实现自动化构建新版本和二维码下载
最近公司开发了自己的app,研发过程中对于测试人员来说,经常会像开发的人员询问,有没有最新的包啊(apk打包后的新版本),以免你测试的时候,提交了一些缺陷,实际上人家已经解决了.当然你也可以说你们公司 ...
- iar调试
我们可以自己建立自己的工程了,但这一步只是开发中的第一小步.今天就来说说开发中举足轻重的另外一件事:调试. 其实调试本身也并不难,楼主总结,调试关键在于两件事,一是运行,二是观察,为了更好的实现这两者 ...
- 5.开发webservice
package com.atguigu.ws; import javax.jws.WebMethod; import javax.jws.WebService; /** * * @author Adm ...
- win2012,oracle11g,sqlplus切换实例的方法
问题环境:windows 2012 r2 64位 ,oracle 11.2.0.4,多个实例. 在这种情况下, sqlplus "/as sysdba" 默认登录的是系统后面安装 ...