网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 网络学院 >> 程序设计 >> VC编程 >> 文章正文
  电子老鼠闯迷宫的C++实现            【字体:
电子老鼠闯迷宫的C++实现
作者:佚名    文章来源:不详    点击数:    更新时间:2007-9-12    

一.问题

如下图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://blog.csdn.net/allen_lou/archive/2007/08/30/1764661.aspx
站内文章搜索 高级搜索
文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
     directx 图形接口指南(…
     win2k下的api函数的拦截
     用crypto  api  实现公钥…
     根据别人的md5源码封装的…
     vc中使用gdi+合并jpg图片
     document/view的交互 --…
     windows下的函数hook技术
     windows api函数大全一
     用vc 6.0实现串行通信的…
     vc++技术内幕(第四版)…
  • 1000本java电子书教程下载

  • JAVA电子书下载

  • 如何在程序启动默认浏览器与…

  • 在PB应用中收发电子邮件

  • 电子商务环境下的新型 编程 …

  • 常用Java编程书籍电子版…

  • 电子商务模型的JSP、JavaBea…

  • 电子商务模型的JSP、JavaBea…

  • 用JSP发送电子邮件

  • 使用JavaMail实现收发电子邮…

  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    网络学院©2007 www.23book.net
    为您提供web编程,vb编程,vc编程,服务器架设管理,数据库设计等方面的知识 站长:David