电子老鼠闯迷宫的C++实现

一.问题

如下图12×12方格图,找出自入口(2,9)到出口(11,8)的最短路径为多少。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 二.分析

       这个问题可以使用广度优先搜索来求解。

三.C++实现

1.SLabyrinth.h

#ifndef SLABYRINTH_H
#define SLABYRINTH_H
#include <queue>
#include <stdio.h>
using namespace std;
class SLabyrinth
{
private:
 int map[12][12];   //-2墙,0可走
 unsigned int first;
 unsigned int aim;
 queue<int> open;
 int n;
public:
 SLabyrinth(void);
 unsigned int Search();
 unsigned int IsCanMove(int x, int y, int *newx, int *newy,int direction);
 unsigned int IsUsed(int x, int y);
 unsigned int IsAim(int x, int y);
 ~SLabyrinth(void);
};
#endif

2.SLabyrinth.cpp

#include "./SLabyrinth.h"

SLabyrinth::SLabyrinth()
{
 n = 12;
 FILE *f;
 char str;
 if((f  = fopen("data1.txt", "r")) != NULL )
 {
  for(int i = 0; i < n; i++)
  { 
   for(int j = 0; j < n; j++)
   {
    str = fgetc(f);
    if(str == '.')
     map[i][j] = 0;   //0表示空格
    else
     map[i][j] = -2;  //-2表示墙

   }
   if (j == n)
   { //换行
    str = fgetc(f);
   }
  }
 }
 fclose(f);
 first = 1*n + 8;
 aim = 10*n + 7;
 open.push(first);
};

unsigned int SLabyrinth::IsAim(int x, int y)
{//是否为目标点
 if ((x == aim/n) && (y = aim%n))
  return 1;
 return 0;
}

unsigned int SLabyrinth::IsUsed(int x, int y)
{//该点是否用过
 if (map[x][y] == 0)
  return 0;
 return 1;
}

unsigned int SLabyrinth::IsCanMove(int x, int y, int *newx, int *newy, int direction)
{//是否可以移动,并将新点保存至newx,newy
 int tempx = x;
 int tempy = y;
 switch (direction)
 {
 case 0:
  tempx--; //left
  break;
 case 1:
  tempy++; //down
  break;
 case 2:
  tempx++; //right
  break;
 case 3:
  tempy--; //up
  break;
 }
 *newx = tempx;
 *newy = tempy;
 if (tempx < 0 || tempx >= n || tempy < 0 || tempy >= n)
  return 0;
 if (map[tempx][tempy] == 0)
  return 1;
 return 0;

}


unsigned int SLabyrinth::Search()
{//BFS
 int u;
 int x;
 int y;
 int num;
 int newx;
 int newy;
 map[first/n][first%n]=1;
 while (!open.empty())
 {
  u = open.front();
  open.pop();
  x = u / n;
  y = u % n;
  num = map[x][y];
  path.push(u);
  for (int i = 0; i < 4; i++)
  {
   if (IsCanMove(x, y, &newx, &newy, i))
   {
    if(IsAim(newx, newy))
     return num;
    if(!IsUsed(newx, newy))
    {
     map[newx][newy] = num + 1;
     open.push(newx*n + newy);
    }
   }
  }
 }
}

SLabyrinth::~SLabyrinth()
{
}

3.Test.cpp

#include "SLabyrinth.h"
#include <iostream>
using namespace std;
void main()
{
 SLabyrinth SLy;
 cout<<SLy.Search()<<endl;
}

4.data1.txt

XXXXXXXXXXXX
X......X.XXX
X.X.XX.....X
X.X.XX.XXX.X
X.X.....X..X
X.XXXXXXXXXX
X...X.X....X
X.XXX...XXXX
X.....X....X
XXX.XXXX.X.X
XXXXXXX..XXX
XXXXXXXXXXXX

 

 

推荐网站:好巴鹿(http://www.haobalu.com )
letao
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值