zoukankan      html  css  js  c++  java
  • 深度优先搜索-linux上浅显易懂的例子

      上次看啊哈算法中的深度优先搜索,自己用的是linux(linux粉,windows黑,嘿嘿),字符界面,为了强化对这个的理解,就在linux上对这个例子的代码做了一点修改可以很清楚的看到整个搜索过程,相当于动态的展示吧,虽然不是动画,本来想用QT来写的,不过实在是没时间(其实是QT太久没用了.....)

      深度优先搜索说到底就是一条道走到黑直到达到目的,然后再往回走,看看上次选择的地方是否还有别的路可以选择走。代码中定义了宏MAX_NUM=8,

    就是8x8的迷宫,

    用户输入开始点和结束点,找到开始点到结束点的最短路径。LOOK:

    其中工代表可以走的路,山是随机出现的20个障碍。

    当指定了起始点后(没做校验,不能落在障碍点上),会将整个搜索过程在界面上打印出来,每秒显示一步:

    当然也可能觉得不停的打印会太繁琐,那就将dfs中的调用dfs_print和sleep注释掉即可。

    再看看最终的结果:

    这个只是其中一条最短路径,而为了减少运算量,我将当前的路径长度和已经找到的路径长度做对比,大于等于时就不往下找了。

    因为当迷宫是40*40,没有加这个,我的虚拟机运行了1分钟都没有出来结果(当然是将打印去掉的情况下)。

    源码:

      1 #include<stdio.h>
      2 #include<string.h>
      3 #include<stdlib.h>
      4 #define MAX_NUM 8
      5 
      6 void dfs_print();
      7 
      8 int maze[MAX_NUM][MAX_NUM];
      9 int book[MAX_NUM][MAX_NUM];
     10 int map[MAX_NUM][MAX_NUM];
     11 int min=10000;
     12 int px,py;
     13 int startx, starty;
     14 
     15 int next[4][2] = {
     16         {0,1},
     17         {1,0},
     18         {0,-1},
     19         {-1,0}};
     20 
     21 void dfs(int x, int y, int step)
     22 {
     23         int i;
     24         int tx,ty;
     25 
     26         /*
     27         printf("
    ");
     28         dfs_print();
     29         sleep(1);
     30         */
     31 
     32         if(step >= min)
     33                 return;
     34         if(x==px && y==py)
     35         {
     36                 printf("SUCCESS! 本次路径长度=%d", step);
     37                 if(step < min)
     38                 {
     39                         printf("本路径是当前最短的路径");
     40                         memcpy(map, book, sizeof(book));
     41                         min= step;
     42                 }
     43                 printf("
    ");
     44                 return;
     45         }
     46 
     47 
     48         for(i=0;i<=3;i++)
     49         {
     50                 tx = x+next[i][0];
     51                 ty = y+next[i][1];
     52                 if(tx <0 || tx >=MAX_NUM || ty <0 || ty >= MAX_NUM)
     53                         continue;
     54 
     55                 if(book[tx][ty] == 0 && maze[tx][ty] == 0)
     56                 {
     57                         book[tx][ty] = 1;
     58                         dfs(tx,ty,step+1);
     59                         book[tx][ty] = 0;
     60                 }
     61         }
     62         return;
     63 }
     64 
     65 void dfs_print()
     66 {
     67         int i,j;
     68         printf("33[2J");
     69         for(i=0;i<MAX_NUM;i++)
     70         {
     71                 for(j=0; j<MAX_NUM; j++)
     72                 {
     73                         if(i==startx && j==starty)
     74                                 printf("33[40;31m头33[0m");
     75                         else if(px==i && py==j)
     76                                 printf("33[40;31m尾33[0m");
     77                         else if(maze[i][j]== 0 && book[i][j]==0)
     78                                 printf("");
     79                         else if(maze[i][j]== 0 && book[i][j]==1)
     80                                 printf("33[40;31m->33[0m");
     81                         else if(maze[i][j] == 1)
     82                                 printf("33[40;32m山33[0m");
     83                 }
     84                 printf("
    ");
     85         }
     86 }
     87 
     88 
     89 void main()
     90 {
     91         int i,j;
     92         int x;
     93         int y;
     94 
     95         memset(maze, 0, sizeof(maze));
     96         for(i=0;i<MAX_NUM*2;i++)
     97         {
     98                 x = random()%MAX_NUM;
     99                 y = random()%MAX_NUM;
    100                 maze[x][y] = 1;
    101         }
    102 
    103         for(i=0; i<MAX_NUM; i++)
    104         {
    105                 for(j=0; j<MAX_NUM; j++)
    106                 {
    107                         if(maze[i][j] == 0)
    108                                 printf("");
    109                         else
    110                                 printf("");
    111                 }
    112                 printf("
    ");
    113         }
    114 
    115         printf("please input start-end point:");
    116         scanf("%d %d %d %d", &startx, &starty, &px, &py);
    117         dfs_print();
    118         book[startx][starty] = 1;
    119         dfs(startx, starty, 0);
    120         printf("MIN=%d
    ", min);
    121         for(i=0;i<MAX_NUM;i++)
    122         {
    123                 for(j=0; j<MAX_NUM; j++)
    124                 {
    125                         if(i==startx && j==starty)
    126                                 printf("33[40;31m头33[0m");
    127                         else if(px==i && py==j)
    128                                 printf("33[40;31m尾33[0m");
    129                         else if(maze[i][j]== 0 && map[i][j]==0)
    130                                 printf("");
    131                         else if(maze[i][j]== 0 && map[i][j]==1)
    132                                 printf("33[40;31m->33[0m");
    133                         else if(maze[i][j] == 1)
    134                                 printf("33[40;32m山33[0m");
    135                 }
    136                 printf("
    ");
    137         }
    138 }
  • 相关阅读:
    设计模式学习总结
    WCF一个Host实现多契约服务
    通过服务端监控结果,说说WCF的并发处理
    分词中常用算法比较与设想
    SQL Server 2008建立分区表(Table Partition)
    .NET 4中Entity Framework 新增查询与优化
    Web Service 接口大量数据传输解决方案
    面向对象的设计原则与目标[总结篇]
    说说ADO.NET EF 中的实体修改方法
    数据库大型应用解决方案总结
  • 原文地址:https://www.cnblogs.com/ding-linux-coder/p/4764282.html
Copyright © 2011-2022 走看看