• 【原创】谈谈数据结构课后作业......尴尬不已...《图》 后面的迷宫问题


      这个题目,要求运用广度优先搜索,然后我已开始对广搜并不太里接,到底搜的是什么?需要把图转换为邻接矩阵

    吗?书上给的函数是用邻接矩阵完成的吗/?总之书上给的很复杂,有一大堆前面实现的函数,然而并不想写,太麻烦。

    比如有一个搜索该点的下一个邻接点,这个函数肯定是在邻接矩阵里完成的,但是这样的话就肯定要用两个二维数组,

    第一是一个用来存放01地图的数组,0代表路,1代表墙。第二个是一个邻接矩阵代表着节点之间的连通关系。这就很尴

    尬了,超级复杂不是吗?书上还没给实现“搜索该点的下一个邻接点”的函数。

    其实我感觉数据结构教的只是一种抽象的结构实现,并不是这个结构必须按照书上的这样实现,你只要自己完成这

    个结构就好了,不管用什么方法。说到这里你可能并不理解我什么意思,假如你看懂的我下面的代码,和书上的加以比

    较,再加上自己的理解,我觉得你应该能明白数据结构这本书的真正作用。

    (别急先看下面的话!!)

    看的时候先看主函数,再看BFS函数,再看print(注意不是printf),其实print函数不看也行。注释写的很详细了,唯一

    难理解的就是那个BFS是怎么实现于队列的。你可以把队列想象成一个竖着的梯子嘛。就是第一格就是头指针,第二

    格就是那个尾指针嘛,然后开始BFS,自己拿张纸画一画,在纸上画一下那个BFS的过程。

    x y pre i
           
           
           
           
    ... ... ... ...
    2 1 0 1
    1 1 -1 0
     1 #include<stdio.h>
     2 
     3 int map[100][100];//定义一个二维数组用于存放迷宫,用0,1表示
     4 int dx[8] = {1,1,0,-1,-1,-1,0,1};//上下为一组,8组分别表示8个方向,下 右下 右 右上...
     5 int dy[8] = {0,1,1,1,0,-1,-1,-1};
     6 typedef struct
     7 {
     8     int x,y;//坐标
     9     int pre;//前驱,从哪个坐标宽搜过来的
    10 }node;
    11 node queue[100];//定义一个队列用于存放路径,用坐标表示
    12 
    13 
    14 int print(int start)//打印路径函数,递归表示
    15 {
    16     if(queue[start].pre != -1)//起点必为(0,0),queue[0]没有前驱,pre==-1
    17     {
    18         map[99][99]++;//用一个不太用的点来存放步数
    19         print(queue[start].pre);//递归,找到起点后执行下一条语句,从起点输出路径
    20         printf("(%d,%d)
    ",queue[start].x -1,queue[start].y -1);//其实并没有外面一圈墙 所以-1
    21     }
    22 }
    23 
    24 int BFS(int a , int b , int m , int n)//最关键的广度优先搜索
    25 {
    26     int front = 0;//头指针指向0
    27     int rear = 1;//尾指针指向1
    28     queue[front].x = a;//头指针指向起始位置坐标为(a,b)
    29     queue[front].y = b;
    30     queue[front].pre = -1;//起始位置没有上一个过来的位置,前驱为-1
    31     while(front < rear)//尾指针一定在头指针上面,也可以理解为队列非空,头尾指针相等时队列为空
    32     {
    33         int i;
    34         for(i=0;i<8;i++)//8个方向依次搜索
    35         {
    36             int nx = queue[front].x+dx[i];//向下就是(a+1,b),向右就是(a,b+1)
    37             int ny = queue[front].y+dy[i];
    38             if(map[nx][ny] == 1) continue;//如果碰到墙,不执行下面语句,继续搜其他方向
    39             else//找到路了
    40             {
    41                 map[nx][ny] = 1;//把路变为墙,以防止再次搜索!
    42                 queue[rear].x = nx;//把找到的路的坐标放进队列
    43                 queue[rear].y = ny;
    44                 queue[rear].pre = front;//这个新的点是由哪个点搜过来的
    45                 rear++;//尾指针++,表示新路入队
    46             }
    47             if(nx==m && ny==n)
    48             {//如果找到了终点开始打印,并结束BFS
    49                 print(--rear);
    50                 return 0;
    51             }
    52         }
    53         front++;//没找到的话,队头出队
    54     }
    55 }
    56 
    57 int main()
    58 {
    59     int i,j;
    60     int m,n;
    61     scanf("%d%d",&m,&n);
    62     for(i=0;i<100;i++) for(j=0;j<100;j++) map[i][j] = 1;//初始化地图,全部置为墙
    63     for(i=1;i<=m;i++)   for(j=1;j<=n;j++)   scanf("%d",&map[i][j]);//输入地图,为什么i,j从1开始?给地图周围加一圈墙,便于搜索 不出界
    64     map[1][1] = 1;//题目要求起点为(1,1) 先把起点改为墙
    65 
    66     printf("(0,0)
    ");//先输出起点 因为输出函数到pre==-1就停止了 无法输出起点
    67     BFS(1,1,m,n);//把起点和终点传入函数
    68     printf("%d",--map[99][99]);//输出步数
    69 }
    70 /*
    71 5 5
    72 0 1 0 0 0
    73 0 1 0 1 0
    74 0 0 0 0 0
    75 0 1 1 1 0
    76 0 0 0 1 0测试数据
    77 */
    View Code
  • 相关阅读:
    haslayout详解
    linux定时任务-cron
    linux安装SVN
    linux java配置
    KVM virsh常用命令篇
    KVM创建虚拟机
    KVM和远程管理工具virt-manager
    mysql 基础命令
    json在线工具
    mvn简单命令
  • 原文地址:https://www.cnblogs.com/liwenchi/p/5537424.html
Copyright © 2020-2023  润新知