迷宫求解

 

任务:可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出;

#include <iostream>

#include <stack>

using namespace std;

 

#define N 100

typedef struct vex{  

  int x;

  int y;

}vex;

 

int n, m;

stack <vex> s;

int visited[N+1][N+1];

int map[N+1][N+1];

vex a, b, c, d;

int dir[4][2] = {1,0,0,1,-1,0,0,-1};

 

int main()

{  

  int i, j;  

  int x, y;  

  stack <vex> Q;  

  while (!s.empty())  

  {

    s.pop();  

  }  

  cout<<"请输入迷宫的大小(0代表能走通,1代表不能走通):";  

  cin>>n>>m;  

  for (i=0; i<n; i++)   

    for (j=0; j<m; j++)   

    {

      cin>>map[i][j];    

      visited[i][j] = 0;   

    }  

  cout<<"请输入起点坐标和终点坐标:";

  loop:cin>>a.x>>a.y>>b.x>>b.y;  

  d = a;  

  if (map[a.x-1][a.y-1]!=0 || map[b.x-1][b.y-1]!=0)  

  {

    cout<<"输入的坐标无效,请重新输入"<<endl;   

    goto loop;  

  }  

  s.push(a);  

  visited[a.x-1][a.y-1] = 1;  

  while (!s.empty())  

  {   

    d = s.top();  

    if (d.x==b.x && d.y==b.y)    

      break;   

    for (i=0; i<4; i++)   

    {    

      x = d.x-1+dir[i][0];    

      y = d.y-1+dir[i][1];   

       if ((x<0) || (y<0) || (x>=m) || (y>=n))     

        continue;    

      if (map[x][y]==0 && visited[x][y]==0)    

      {     

        c.x = x+1;     

        c.y = y+1;     

        s.push(c);     

        visited[x][y] = 1;     

        break;    

      }

    }   

    if (i == 4)   

    {

      d = s.top();    

      map[d.x-1][d.y-1] = 1;    

      s.pop();   

    }  

  } 

 

   if (s.empty())  

  {   

    cout<<"没有找到路径"<<endl;  

  }  

  else  

  {   

     while (!s.empty())   

    {    

      Q.push(s.top());    

      s.pop();   

    }   

    c = Q.top();   

    cout<<"("<<c.x<<","<<c.y<<")";  

     Q.pop();   

    while (!Q.empty())   

    {    

      c = Q.top();    

      Q.pop();    

      cout<<"->("<<c.x<<","<<c.y<<")";  

     }   

    cout<<endl;  

  }

  return 0;

}

posted @ 2013-12-21 13:57  仰望天kong  阅读(306)  评论(0编辑  收藏  举报