博客首页 注册 建议与交流 排行榜 加入友情链接         宝宝相册的专门空间
推荐 投诉 搜索: 帮助

ypxing

学而不思则罔,思而不学则殆

见贤思齐焉,见不贤而内自省也

人不知而不愠,不亦君子乎?

   ypxing.cublog.cn
关于作者  
姓名:星云鹏 (Yunpeng Xing)
职业:IT相关
年龄:28
位置:北京
个性介绍:
Love me, feed me, 
never leave me.
失败只有一种, 那就是半途而废

我的分类  




广度优先遍历解决布线迷宫问题

#include <iostream>
#include <stack>
#include <queue>
using namespace std;

//0--unopccupied
//-5--barricade
//-4--right to left
//-3--up to down
//-2--left to right
//-1--down to up
#define BA -5
#define RL -4
#define LR -2
#define UD -3
#define DU -1

char maze[16][16]={
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, BA, 0, 0, 0, 0},
  {0, BA, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, BA, 0, 0, 0},
  {0, 0, BA, BA, 0, 0, 0, 0, 0, 0, 0, BA, 0, 0, 0, 0},
  {0, 0, 0, BA, 0, 0, 0, 0, BA, BA, BA, 0, 0, 0, 0, 0},
  {0, 0, 0, BA, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, BA, 0, BA, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, BA, BA, 0, 0, 0, 0, 0, 0, BA, BA, BA, 0, 0},
  {0, 0, 0, BA, 0, 0, 0, 0, 0, 0, 0, 0, 0, BA, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, BA, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, BA, 0, 0, 0},
  {0, BA, BA, 0, 0, 0, BA, BA, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, BA, BA, 0, 0, 0, BA, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {BA, BA, BA, 0, 0, BA, BA, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, BA, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, BA, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};

class Position
{
public:
  Position()
  {
    x = 0;
    y = 0;
  }
  
  Position(int _x, int _y)
  {
    x = _x;
    y = _y;
  }
  
  Position& operator=(const Position& ps)
  {
    x = ps.x;
    y = ps.y;
    return *this;
  }
  bool operator==(const Position& ps) const
  {
    return ((x==ps.x)&&(y==ps.y));
  }

  bool operator!=(const Position& ps) const
  {
    return !operator==(ps);
  }
  
  int x;
  int y;
};

bool FindPath(Position start, Position end)
{
  //in fact, the start and end should be verified

  if (start==end)
  {
    cout <<start.x << ", " << start.y << endl;
    return true;
  }
  Position cur, temp;
  queue<Position> mq;
  cur.x = start.x;
  cur.y = start.y;
  
  while (cur!=end)
  {
    if ((cur.y>0)&&(maze[cur.x][cur.y-1]==0))
    {
      maze[cur.x][cur.y-1]=-1;
      temp.x = cur.x; temp.y=cur.y-1;
      mq.push(temp);
    }
    if ((cur.x<16-1)&&(maze[cur.x+1][cur.y]==0))
    {
      maze[cur.x+1][cur.y]=-2;
      temp.x = cur.x+1; temp.y=cur.y;
      mq.push(temp);
    }
    if ((cur.y<16-1)&&(maze[cur.x][cur.y+1]==0))
    {
      maze[cur.x][cur.y+1]=-3;
      temp.x = cur.x; temp.y=cur.y+1;
      mq.push(temp);
    }
    if ((cur.x>0)&&(maze[cur.x-1][cur.y]==0))
    {
      maze[cur.x-1][cur.y]=-4;
      temp.x = cur.x-1; temp.y=cur.y;
      mq.push(temp);
    }
    if (mq.empty())
      return false;
    cur = mq.front();
    mq.pop();
  }
  
  if (cur!=end)
    return false;
  
  while (cur!=start)
  {
    cout << cur.x << ", " << cur.y << endl;
    if (maze[cur.x][cur.y]==-1)
    {
      cur.y = cur.y + 1;
    }
    else if (maze[cur.x][cur.y]==-2)
    {
      cur.x = cur.x - 1;
    }
    else if (maze[cur.x][cur.y]==-3)
    {
      cur.y = cur.y -1;
    }
    else
    {
      cur.x = cur.x + 1;
    }
  }
 
}

int main(int argc, char* argv[])
{
  Position start(0, 0), end(5, 4);
  FindPath(start, end);
}

 发表于: 2007-10-25,修改于: 2007-10-25 09:48 已浏览445次,有评论0条 推荐 投诉

  网友评论

  发表评论



Copyright © 2001-2006 ChinaUnix.net All Rights Reserved

感谢所有关心和支持过ChinaUnix的朋友们
页面生成时间:0.0132

京ICP证041476号