DFS深度搜索;之前一直和bfs的用法搞不太清楚;写了题才能慢慢参透吧,看了别的博客的代码,感觉能更好理解dfs在图中的应用;

这个题目的意思是一个人去救另一个人,找出最短的寻找路径;

  1. #include<stdio.h>
  2. int n,m,p,q,min=;
  3. int a[][],book[][];
  4. void dfs(int x,int y,int step)
  5. {
  6. int next[][]={
  7. {,},//向右走
  8. {,},//向下走
  9. {,-},//向左走
  10. {-,},//向上走
  11. };
  12. int tx,ty,k;
  13. if(x==p && y==q) //判断是否到达小哈的位置
  14. {
  15. if(step<min)
  16. min=step; //更新最小值
  17. return;
  18. }
  19. /*枚举四种走法*/
  20. for(k=;k<=;k++)
  21. {
  22. /*计算下一个点的坐标*/
  23. tx=x+next[k][];
  24. ty=y+next[k][];
  25. if(tx< || tx>n || ty< || ty>m) //判断是否越界
  26. continue;
  27. /*判断该点是否为障碍物或者已经在路径中*/
  28. if(a[tx][ty]== && book[tx][ty]==)
  29. {
  30. book[tx][ty]=; //标记这个点已经走过
  31. dfs(tx,ty,step+); //开始尝试下一个点
  32. book[tx][ty]=; //尝试结束,取消这个点的标记
  33. }
  34. }
  35. return;
  36. }
  37.  
  38. int main()
  39. {
  40. int i,j,startx,starty;
  41. scanf("%d %d",&n,&m); //读入n和m,n为行,m为列
  42. /*读入迷宫*/
  43. for(i=;i<=n;i++)
  44. for(j=;j<=m;j++)
  45. scanf("%d",&a[i][j]);
  46. scanf("%d %d %d %d",&startx,&starty,&p,&q); //读入起点和终点坐标
  47. /*从起点开始搜索*/
  48. book[startx][starty]=; //标记起点已经在路径中,防止后面重复走
  49. dfs(startx,starty,); //第一个参数是起点的x坐标,以此类推是起点的y坐标,初始步数为0
  50. printf("%d",min); //输出最短步数
  51. return ;
  52. }

然后又写了POJ上叫flip game的游戏,又刷新了我的认知.....

在看了一些代码后,才知道dfs需要考虑做和不做的问题,做了之后dfs,做完恢复,不做就继续走;

  1. #include <stdio.h>
  2. #include <string>
  3. #include <string.h>
  4. #include <iostream>
  5. #include <algorithm>
  6. #include <cmath>
  7. using namespace std;
  8. const int inf=0x3f3f3f3f;
  9. char map[][];
  10. int dir[][]={{,},{,},{,-},{-,},{,}},minn;
  11. int judge(){
  12. char a=map[][];
  13. for(int i=;i<;++i){
  14. for(int j=;j<;++j){
  15. if(map[i][j]!=map[][])
  16. return ;
  17. }
  18. }
  19. return ;
  20. }
  21. void swap(int x,int y){
  22. for(int i=;i<;++i){
  23. int xx=dir[i][]+x;
  24. int yy=dir[i][]+y;
  25. if(xx>=||yy>=||xx<||yy<)
  26. continue;
  27. if(map[xx][yy]=='b') //变换
  28. map[xx][yy]='w';
  29. else if(map[xx][yy]=='w')
  30. map[xx][yy]='b';
  31. }
  32. }
  33. void dfs(int x,int y,int step){
  34. if(step>)
  35. return; //超过步数 ,break
  36. if(judge()){
  37. minn=minn>step?step:minn; //维护最小值
  38. }
  39. if(y>=){
  40. x++;
  41. y=;
  42. }
  43. if(x>=){
  44. return; //break;
  45. }
  46. for(int j=;j<;++j){
  47. if(j==){
  48. swap(x,y);//换的情况
  49. dfs(x,y+,step+);//按这个路子继续深搜
  50. swap(x,y);//恢复原状
  51. }
  52. else{
  53. dfs(x,y+,step); //不翻;
  54. }
  55. }
  56. }
  57. int main(void){
  58. minn=inf;
  59. for(int i=;i<;++i){
  60. scanf("%s",map[i]);
  61. }
  62. dfs(,,); //从起点开始搜;
  63. if(minn>)//步数比总棋子还多,说明不可能实现全部转换
  64. printf("Impossible\n");
  65. else{
  66. printf("%d\n",minn);
  67. }
  68. return ;
  69. }

这个代码好丑..但是复制上去就懒的删了..

和上一题差不多意思,因为一个点只会被翻一次,翻两次没有意义;

dfs(深度优先搜索)是两个搜索中先理解并使用的,其实就是暴力把所有的路径都搜索出来,它运用了回溯,保存这次的位置,深入搜索,都搜索完了便回溯回来,搜下一个位置,直到把所有最深位置都搜一遍,要注意的一点是,搜索的时候有记录走过的位置,标记完后可能要改回来;

2.bfs(宽度/广度优先搜索),这个一直理解了思想,不会用,后面才会的,思想,从某点开始,走四面可以走的路,然后在从这些路,在找可以走的路,直到最先找到符合条件的,这个运用需要用到队列(queue),需要稍微掌握这个才能用bfs;

这是网上找到的dfs与bfs的区别;

贴上一个bfs的板子

  1. int visit[N][N]//用来记录走过的位置
  2. int dir[][]={,-,,,-,,,};
  3. struct node
  4. {
  5. int x,y,bits;//一般是点,还有步数,也可以存其他的
  6. };
  7. queue<node>v;
  8. void bfs1(node p)
  9. {
  10. node t,tt;
  11. v.push(p);
  12. while(!v.empty())
  13. {
  14. t=v.front();//取出最前面的
  15. v.pop();//删除
  16. if(找到符合条件的)
  17. {
  18. 做记录;
  19. while(!v.empty()) v.pop();//如果后面还需要用,随手清空队列
  20. return;
  21. }
  22. visit[t.x][t.y]=;//走过的进行标记,以免重复
  23. rep(i,,)//做多次查找
  24. {
  25. tt=t;
  26. tt.x+=dir[i][];tt.y+=dir[i][];//这里的例子是向上下左右查找的
  27. if(如果这个位置符合条件)
  28. {
  29. tt.bits++;//步数加一
  30. v.push(tt); //把它推入队列,在后面的时候就可以用了
  31. }
  32. }
  33. }
  34. }

dfs关于按钮问题(flip游戏POJ1753)以及和bfs的区别+板子的更多相关文章

  1. 游戏服务器和Web服务器的区别

    用Go语言写游戏服务器也有一个多月了,也能够明显的感受到两者的区别.这篇文章就是想具体的聊聊其中的区别.当然,在了解区别之间,我们先简单的了解一下Go语言本身. 1. Go语言的特点 Go语言跟其他的 ...

  2. 图论中DFS与BFS的区别、用法、详解…

    DFS与BFS的区别.用法.详解? 写在最前的三点: 1.所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次. 2.实现bfs和dfs都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵 ...

  3. 图论中DFS与BFS的区别、用法、详解?

    DFS与BFS的区别.用法.详解? 写在最前的三点: 1.所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次. 2.实现bfs和dfs都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵 ...

  4. dfs和bfs的区别

    详见转载博客:https://www.cnblogs.com/wzl19981116/p/9397203.html 1.dfs(深度优先搜索)是两个搜索中先理解并使用的,其实就是暴力把所有的路径都搜索 ...

  5. dfs+枚举,flip游戏的拓展POJ2965

    POJ 2965             The Pilots Brothers' refrigerator Description The game “The Pilots Brothers: fo ...

  6. Flip Game poj1753

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 32961   Accepted: 14407 Description Fli ...

  7. POJ 1753 Flip Game (状态压缩 bfs+位运算)

    Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of its 16 square ...

  8. Unity游戏暂停之Update与FixedUpdate区别

    游戏暂停 示例程序 下面这段代码演示游戏暂停 using UnityEngine; using System.Collections; public class GamePauseTest : Mon ...

  9. 深搜(DFS)与广搜(BFS)区别

    最近做了不少的搜索题,时而用到DFS时而用到BFS,这里对两种搜索方法做一个总结. 广度优先搜索算法(Breadth-First-Search,缩写为 BFS),是一种利用队列实现的搜索算法.简单来说 ...

随机推荐

  1. Big research problems (1)

    1. how to measure the uncertainty of prediction model or data analysis? 2.

  2. 《CSS揭秘》》

    1,透明边框 默认状态下,背景会延伸到边框区域的下层.这样就在半透明的黑色边框中透出了这个容器自己的纯白色背景. 谢天谢地,从w3c的背景与边框第三版开始,我们可以通过 background-clip ...

  3. python操作mongo实例

    # coding:utf-8 """ mongo操作工具 """ from pymongo import MongoClient MONGO ...

  4. linux-zookeeper安装、配置

    1.下载zookeeper包 (地址:https://www-eu.apache.org/dist/zookeeper/) 2.上传zookeeper包到指定位置(例如: /usr/local/sof ...

  5. 这里有一份热乎乎的git相关操作

    文件操作 git init (添加文件): git status (查看文件状态): git diff (查看修改内容): git rm (删除文件): git add (把文件保存在暂存区): gi ...

  6. koa2第一天 安装koa2found 1 low severity vulnerability run `npm audit fix` to fix them, or `npm audit` for details

    安装全局koa2:npm install -g koa2 -generator 创建一个koa2文件夹:koa2 -e koa2 进入koa2文件夹:cd koa2 安装npm模块:npm insta ...

  7. SpringMVC-时间类型转换

    在上一篇SpringMVC的提交表单中,我们使用的日期为String型,可以将日期转换为Date型,然后使用initBinder函数进行显示,具体代码如下: (1)首先更改User.java的birt ...

  8. 【正确使用vim编辑器的姿势】

    "vi:可视化接口(Visual Interface) vim:是vi的增强版(vi iMprove) vi编辑器是所有Unix及Linux系统下标准的编辑器,他就相当于windows系统中 ...

  9. 在java中使用FFmpeg处理视频与音频

    FFmpeg是一个非常好用的视频处理工具,下面讲讲如何在java中使用该工具类. 一.首先,让我们来认识一下FFmpeg在Dos界面的常见操作 1.拷贝视频,并指定新的视频的名字以及格式 ffmpeg ...

  10. Flask 教程 第十九章:Docker容器上的部署

    本文翻译自The Flask Mega-Tutorial Part XIX: Deployment on Docker Containers 这是Flask Mega-Tutorial系列的第十九部分 ...