一个陷入迷宫的老鼠如何找到出口的问题。老鼠希望系统性地尝试所有的路径之后走出迷宫。如果它到达一个死胡同,将原路返回到上一个位置,尝试新的路径。在每个位置上老鼠可以向八个方向运动,顺序是从正东开始按照顺时针进行。无论离出口多远,它总是按照这样的顺序尝试,当到达一个死胡同之后,老鼠将进行“回溯”。迷宫只有一个入口,一个出口,设计程序要求输出迷宫的一条通路。迷宫采用二维存储结构表示,1表示障碍,0表示通路;要求如下: 1、实现队列的相关操作; 2、利用队列进行广度策略搜索算法输出路径;

输入格式:

输入包括三部分: 第一个输入是迷宫大小;第二个输入是迷宫的状态;第三个输入是入口和出口位置

输出格式:

反向输出探索的路径,注意包括入口和出口位置。每个位置之间用分号;分隔。

输入样例:

9
1 1 1 1 1 1 1 1 1
1 0 0 1 1 0 1 1 1
1 1 0 0 0 0 0 0 1
1 0 1 0 0 1 1 1 1
1 0 1 1 1 0 0 1 1
1 1 0 0 1 0 0 0 1
1 0 1 1 0 0 0 1 1
1 1 1 1 1 1 1 0 1
1 1 1 1 1 1 1 1 1
1 1 7 7

输出样例:

7 7;6 6;5 6;4 5;3 4;2 3;1 2;1 1;

代码

#include <stdio.h>
#include <stdlib.h>
typedef int DataType;
struct Node
{DataType data;struct Node *link;
};
typedef struct Node*PNode;
struct Queue
{PNode f;PNode r;
};
typedef struct Queue *LinkQueue;
struct MAZE_STRU
{int size;int **data;
};
typedef struct MAZE_STRU Maze;
LinkQueue SetNullQueue_Link()//创建空队列
{LinkQueue lqueue;lqueue=(LinkQueue)malloc(sizeof(struct Queue));if(lqueue!=NULL){lqueue->f=NULL;lqueue->r=NULL;}elseprintf("Aloc failure!\n");return lqueue;
}
int IsNullQueue_Link(LinkQueue lqueue)//判断队列是否为空
{return  (lqueue->f==NULL);
}
void EnQueue_Link(LinkQueue lqueue,DataType x)//入队操作
{PNode p;p=(PNode)malloc(sizeof(struct Node));//申请节点空间if(p==NULL)printf("Alloc Failure!\n");else{    p->data=x;//数据域赋值p->link=NULL;//指针域赋值if(lqueue->f==NULL)//空队列的特殊处理{lqueue->f=p;lqueue->r=p;}else{lqueue->r->link=p;//插入队尾lqueue->r=p;//修改队尾指针}}}
void DeQueue_Link(LinkQueue lqueue)
{PNode p;if(lqueue->f==NULL)printf("It is empty queue!\n");else{p=lqueue->f;lqueue->f=lqueue->f->link;free(p);}
}
DataType FrontQueue_Link(LinkQueue lqueue)
{if(lqueue->f==NULL){printf("It is empty queue");return 0;}else{return lqueue->f->data;}}
Maze* InitMaze(int size)
{int i;Maze*maze=(Maze*)malloc(sizeof(Maze));maze->size=size;maze->data=(int **)malloc(sizeof(int*)*maze->size);for(i=0;i<maze->size;i++){maze->data[i]=(int*)malloc(sizeof(int)*maze->size);}return maze;
}
void ReadMaze(Maze* maze)
{   int i,j;for(i=0;i<maze->size;i++){for(j=0;j<maze->size;j++)scanf("%d",&maze->data[i][j]);}
}
void WriteMaze(Maze* maze)
{int i,j;printf("迷宫的结构如下:\n");for(i=0;i<maze->size;i++){for(j=0;j<maze->size;j++){printf("%5d",maze->data[i][j]);}printf("\n");}
}int MazeBFS(int entryX,int entryY,int exitX,int exitY,Maze *maze)
{LinkQueue linkQueueX=NULL;LinkQueue linkQueueY=NULL;int direction[8][2]={{0,1},{1,1},{1.0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};int preposX,preposY;int posX,posY;//临时变量,存放坐标点(x,y)int i,j,mov;int **preposMarkX;//记录迷宫行走的前驱X值int **preposMarkY;//记录迷宫行走过程中的前驱Y值int **Mark;//标记二维数组,标记那些点走过,不再重复走//给存放前驱的数组X分配空间preposMarkX=(int **)malloc(sizeof(int*)*maze->size);for(i=0;i<maze->size;i++){preposMarkX[i]=(int *)malloc(sizeof(int)*maze->size);}//给存放前驱的数组Y分配空间preposMarkY=(int **)malloc(sizeof(int*)*maze->size);for(i=0;i<maze->size;i++){preposMarkY[i]=(int *)malloc(sizeof(int)*maze->size);}//给做标记的二维数组分配空间,并附初值Mark=(int **)malloc(sizeof(int*)*maze->size);for(i=0;i<maze->size;i++){Mark[i]=(int *)malloc(sizeof(int)*maze->size);}for(i=0;i<maze->size;i++)//给所有元素设置初值{for(j=0;j<maze->size;j++){preposMarkX[i][j]=-1;preposMarkX[i][j]=-1;Mark[i][j]=0;}}linkQueueX=SetNullQueue_Link();//创建空队列linkQueueY=SetNullQueue_Link();//创建空队列EnQueue_Link(linkQueueX,entryX);//迷宫入口点入队EnQueue_Link(linkQueueY,entryY);//迷宫入口点入队Mark[entryX][entryY]=1;//迷宫设置标志位while(!IsNullQueue_Link(linkQueueX)){preposX=FrontQueue_Link(linkQueueX);//取队头DeQueue_Link(linkQueueX);//出队preposY=FrontQueue_Link(linkQueueY);//取队头DeQueue_Link(linkQueueY);//出队//将于当前点相邻且满足一定条件的点放入队列for(mov=0;mov<8;mov++){posX=preposX+direction[mov][0];posY=preposY+direction[mov][1];if(posX==exitX&&posY==exitY)//到达出口点{preposMarkX[posX][posY]=preposX;preposMarkY[posX][posY]=preposY;while(!(posX==entryX&&posY==entryY)){preposX=preposMarkX[posX][posY];preposY=preposMarkY[posX][posY];if(posX==exitX&&posY==exitY)printf("%d %d;",exitX,exitY);posX=preposX;posY=preposY;printf("%d %d;",posX,posY);}return 1;}//如果能走,且没有被扩展过if(maze->data[posX][posY]==0&&Mark[posX][posY]==0){EnQueue_Link(linkQueueX,posX);//入队扩展EnQueue_Link(linkQueueY,posY);Mark[posX][posY]=1;//做标记preposMarkX[posX][posY]=preposX;//记录前驱preposMarkY[posX][posY]=preposY;}}}return 0;
}
int main()
{Maze* maze;int mazeSize;int entryX,entryY,exitX,exitY;int find=0;scanf("%d",&mazeSize);maze=InitMaze(mazeSize);ReadMaze(maze);scanf("%d%d%d%d",&entryX,&entryY,&exitX,&exitY);find=MazeBFS(entryX,entryY,exitX,exitY,maze);if(find==0)printf("找不到路径!");return 0;
}

迷宫-广度策略 pta相关推荐

  1. 农夫过河-广度策略 pta

    一个农夫带着一只狼.一只羊和一棵白菜,身处河的南岸.他要把这些东西全部运到北岸.遗憾的是他只有一只小船,小船只能容下他和一件物品.这里只能是农夫来撑船.同时因为狼吃羊,而羊吃白菜,所以农夫不能留下羊和 ...

  2. 利用广度策略解决迷宫问题

    基本思路 1.创建两个空队列LinkQueueX和LinkQueueX 2.将入口entreX和entryY分别压入队列LinkQueueX和LinkQueueX. 3.当队列不空 ①取队头元素,出队 ...

  3. 行业“无人区”生存法则:看新潮传媒市场策略“广度”

    "无人区出勇者",市场正演绎此真理. 整个市场更新迭代至今,各行业赛道上都已挤满无数个"淘金"参赛者,新品牌想要从中脱颖而出绝非易事,但各行业内依旧蕴含着资源丰 ...

  4. 十一、递归----迷宫问题

    一.递归的概念 1.递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时 可以让代码变得简洁. 二.递归调用机制 三.递归可以解决的问题 1.各种数学问题如: 8 ...

  5. 牛客 - 走迷宫(模拟+离线)

    题目链接:点击查看 题目大意:给出一个走迷宫的策略: while(1){ if (前面没有障碍 && 前面还没有走过) 前进一步(); else if(右边没有障碍 && ...

  6. 实验三:基于A*算法的迷宫

    实验要求: 1.迷宫随机生成 2.玩家走迷宫,留下足迹: 3.系统用A*算法寻路,输出路径 解决问题: 1.如何显示迷宫的图形界面: 2.如何生成随机的迷宫: 3.怎样移动游戏中走迷宫的"玩 ...

  7. 迷宫逃离的问题-CoCube

    ROS1云课→20迷宫不惑之A*大法(一种虽古老但实用全局路径规划算法) 将CoCube分别放入如下地图中的左侧,如何从右侧逃离: 需要算法:求解起点到终点的路径. 还需要什么? 参考: (eng.l ...

  8. C++抽象编程——回溯算法(1)——迷宫问题

    这部分内容其实是递归策略的一部分,但是里面涉及到了一些面向对象的知识,所以我就先总结了面向对象那一部分.这部分内容不得不说还是很有意思的. ##迷宫问题 曾经在希腊神话时代,地中海的克里特岛被一个名叫 ...

  9. 详解:Drools规则引擎探究

    引入 ▐ 问题引入 天猫奢品业务方为了吸引更多的新客,和提高会员的活跃度,做了一期活动,通过购买天猫奢品频道内的任意商品就赠送特殊积分,积分可以直接兑换限量的奢品商品.假如业务方给的规则如下: 主刃同 ...

最新文章

  1. 产品项目的九个敏捷开发经验
  2. Tensorflow实例:(卷积神经网络)LeNet-5模型
  3. initWithNibName与viewDidLoad的执行关系以及顺序
  4. 每日一题:leetcode724.寻找数组的中心索引
  5. python元胞自动机模拟交通_结构专栏 | 解析DEFORM软件中的元胞自动机法
  6. PowerPC E500 MMU详解
  7. android 第三方框架
  8. 用Matlab搭建GUI视频处理工具
  9. 大学心理学课本_2019年北京师范大学765真题分析
  10. bzoj2958: 序列染色3269: 序列染色
  11. 超强合集:OCR 文本检测干货汇总(含论文、源码、demo 等资源)
  12. HMC5883L手册总结与经验分析 详解
  13. 2020年浙江大学金融考研经验分享
  14. 2003sql php_Windows Server 2003下安装PHP +mssql2000
  15. 使用CSS给图片加上角标记
  16. spring boot 2.0 官方文档 (一)
  17. gcc ------ 编译与链接选项及CFLAGS、LDFLAGS、LIBS
  18. Silverlight 教程第二部分:使用布局管理 (木野狐译)
  19. 楼市步入慢行道 购房窗口期显现?
  20. python批量下载邮件附件

热门文章

  1. vs单步调试及断点调试基本介绍(入门版详细图文介绍)
  2. 被质检总局禁用6年的“万能插座”,你家可能正在用
  3. Windows 10 下的高效抓屏方法
  4. pc端常用电脑屏幕及响应式
  5. 机器学习模型训练全流程
  6. 天天象棋 残局闯关 第13关
  7. LWJGL入门指南:使用《我的世界》(Minecraft)同款游戏库开发一个超级“简单”的3D射击游戏
  8. C语言之全局变量和局部变量习题
  9. 中国MRI市场预测与投资战略研究报告(2022版)
  10. AngularJs仿淘宝购物车