迷宫求解

 

                                             迷宫求解

 //广度优先搜索..搜索到的第一条路径就是迷宫的最短路径
#include <stdio.h>
struct PointMaze
{
 int  x;   //X坐标
 int  y;  //Y坐标
};
//队列的节点
struct Queue
{
 PointMaze  Coordinate;  //坐标
 int     prev;   //记录前一步的坐标
};

//四周都设为墙之后的迷宫
int maze[7][7] = {
 1, 1, 1, 1, 1, 1, 1,
 1, 0, 1, 0, 0, 0, 1,
 1, 0, 1, 0, 1, 0, 1,
 1, 0, 0, 0, 0, 0, 1,
 1, 0, 1, 1, 1, 0, 1,
 1, 0, 0, 0, 1, 0, 1,
 1, 1, 1, 1, 1, 1, 1
};

//四个方向
const PointMaze step[4] = {{0,-1}, {-1,0}, {0,1}, {1,0} };

int head = 0;
int tail = 0;

int main()
{
 //用数组模拟队列
 Queue answer[100];
 //相当于队列的初始化,并往队列插入第一个元素
 answer[0].prev = -1;
 answer[0].Coordinate.x = answer[0].Coordinate.y = 1;
 maze[1][1] = 1;
 ++tail;
 //因为要打印出路径,所以队列的删除操作并不是真正的删除
 //而是把队列的头节点往后移动一个位置

 //如果head等于tail 那么队列就为空,如果此时还没收索到路径,则迷宫无解
 while(head != tail)
 {
  int i;
  for(i = 0; i < 4; ++i)
  {
   int x = answer[head].Coordinate.x + step[i].x;
   int y = answer[head].Coordinate.y + step[i].y;
   //如果x,y可走 则把x,y设为不可走,并且把x,y插入到队列,队列的尾指针后移一个位置
   //相当于队列的插入操作
   if(maze[x][y] == 0)
   {
    answer[tail].prev = head;
    answer[tail].Coordinate.x = x;
    answer[tail].Coordinate.y = y;
    ++tail;
    maze[x][y] = 1;
   }
   //如果到了最后位置,则就为迷宫的最短路径
   //用先前保存的信息将路径找出,并打印
   if(x == 5 && y == 5 )
   {
    int nPos = tail - 1;
    int nSize = 0;
    PointMaze path[100];
    while(nPos != -1)
    {
     path[nSize].x = answer[nPos].Coordinate.x;
     path[nSize].y = answer[nPos].Coordinate.y;
     ++nSize;
     nPos = answer[nPos].prev;
    }
    for(i = nSize - 1; i >= 0; -- i)
    {
     printf("(%d,%d)\n", path[i].x-1, path[i].y-1);
    }
    return 0;
   }
  }
  //如果当前节点已经不可扩展了,则头指针后移动一位
  //相当于队列的删除操作
  ++head;
 }
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值