走迷宫------------数据结构

断断续续花了一天时间,一天啊!才遍了这么一个走迷宫!          它可以用来为我下一步继续研究更高层次的搜索做铺垫。

算法是按照数据结构那本书中的,就是一个栈。没别的了!        等等,期间遇到了一个问题。我想调用函数得到多个返回值,查了一下,一般有两种方法。1.用全局变量来处理(我就是这样) 2.用地址做参数(带研究)。

不说了,反正写出来了。160多行,挺费劲儿的。

代码:

#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
 
int xd,yd;                 //全局变量,我所定义的当前坐标,即下一个要探索的方格坐标

struct board                //棋盘
{
 int  p;                //方格的性质,0为通路,1为墙               (初始化为1)
 int  q;                //访问痕迹,  1没有走过,走过就标记为2       (初始化为1)
 int  fang;             //该方格四周探索过的方向, 1表示没有探索过,5表示都探索过  (初始化为1)
}board[12][12];  

struct stack               //栈记录迷宫路径
{
 int x[100];            //记录横坐标 
 int y[100];            //记录纵坐标
 int top;     
}s;

void initstack(stack &s)    //栈初始化
{
 s.top=0;
}
void push(int xx,int yy)    //将该方格的坐标x1,y1入栈
{
 s.top++;
 s.x[s.top]=xx;
 s.y[s.top]=yy;
}
int pop(stack &s)           //出栈,如果返回值是0,则说明没有路了(我现在没有考虑这种情况)
{
 if(s.top==0)
 return 0;
 else
 {
  s.top--;
 }
}

int f_xd(int i,int j)          //切换新的位置坐标
{
 xd=i;
 yd=j;
 int k;
 if(board[xd][yd].fang==1)   
 {
  k=board[xd][yd].fang++;
  xd--;
  return k;
 }
 if(board[xd][yd].fang==2)   
 {
  k=board[xd][yd].fang++;
  yd++;
  return k;
 }
 if(board[xd][yd].fang==3)   
 {
  k=board[xd][yd].fang++;
  xd++;
  return k;
 }
 if(board[xd][yd].fang==4)   
 {
  k=board[xd][yd].fang++;
  yd--;
  return k;
 }
 if(board[xd][yd].fang==5)
 {
  return 5;
 }
}
 

int main()
{
 int i,j,n;
 int x2,y2,x3,y3;                       //x2,y2是起点坐标,x3,y3终点坐标
 
  for(i=0;i<12;i++)                     //将棋盘初始化
  {
   for(j=0;j<12;j++)
   {
    board[i][j].p=1;
    board[i][j].q=1;
    board[i][j].fang=1;
   }
 }
    
 //memset(board,1,sizeof(board));         //把棋盘初始化,
 initstack(s);                          //栈初始化
 
 printf("迷宫格局为n*n矩阵(1<n<9)请输入边长n\n");
 scanf("%d",&n);
 printf("请输入迷宫,由0,1组成。数字间由空格分隔\n");
 for(i=1;i<=n;i++)                      
 {
  for(j=1;j<=n;j++)
  {
   scanf("%d",&board[i][j].p);
  }
 }                                          //现在棋盘已经铸造好
 
 printf("您的迷宫如下:\n");
 
 for(i=0;i<=n+1;i++)                  //输出迷宫
 {
  for(j=0;j<=n+1;j++)
  printf("%d ",board[i][j].p);
  printf("\n");
 }
 
 printf("请输入起点坐标\n");
 scanf("%d%d",&x2,&y2);
 printf("请输入终点坐标\n");
 scanf("%d%d",&x3,&y3);
 
 xd=x2;
 yd=y2;
 push(xd,yd);                                  //将起点入栈,并标记
 board[xd][yd].q=2;                            //标记该点已经走过
 f_xd(xd,yd);                                   //转换出新的坐标地址
 
 while(s.top!=0)
 {
  if(board[xd][yd].p==0&&board[xd][yd].q==1)     //如果当前位置可通,切没有被走过
  {
   push(xd,yd);                           //入栈并标记
   board[xd][yd].q=2;
   
      if(xd==x3&&yd==y3)                      //如果这个位置是出口,则结束 
   break;
   else
   f_xd(xd,yd);
  }
  else
  {
   if(s.top!=0&&board[s.x[s.top]][s.y[s.top]].fang<5)       //如果栈不为空,且栈顶位置有其他方向未经探索
    f_xd(s.x[s.top],s.y[s.top]);                            //寻找新的当前位置
   
   if(s.top!=0&&board[s.x[s.top]][s.y[s.top]].fang==5)      //如果栈不为空,但栈顶四周均不可通
    {
     pop(s);                                //删去栈顶元素
     if(s.top!=0)
     {
      f_xd(s.x[s.top],s.y[s.top]);          //测试新的栈顶原书的位置
     }
    }
  }
    }
    printf("从起点到终点的路径如下\n\n");
    printf("%d %d\n",xd,yd);                             //问题出在这里     FUCK
   
 for(i=1;i<=s.top;i++)
 printf("[%d][%d]-->",s.x[i],s.y[i]);
 getch();
 return 0;
}

posted on 2012-02-28 18:06  hrbust_09zhangyabin  阅读(435)  评论(0编辑  收藏  举报