龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

迷宫问题

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
大家好,我是一个菜鸟,现在正在学习数据结构,希望大家指点我,我编写了一个走迷宫的程序,希望大家指点。源程序如下:(可以动态实现) #include"time.h" #include "stdio.h" #include "g

大家好,我是一个菜鸟,现在正在学习数据结构,希望大家指点我,我编写了一个走迷宫的程序,希望大家指点。源程序如下:(可以动态实现)

#include"time.h"

  #include "stdio.h"

  #include "graphics.h"

  #include "conio.h"

  #define null 0

int a[11][15]={ , /定义迷宫,这是我们课程设计,所以就用老师给的了/

   , /0代表墙,1代表可以通行/

   ,

   ,

   ,

   ,

   ,

   ,

   ,

   ,

  

   };

  strUCt moving /定义走动方向/

  {int x;

   int y;

  }move[9]=,,,,,,,,};

  typedef struct Position *PPosition;

  struct Position /定义结构体/

  {

   int x;

   int y;

   int direction;

   PPosition link;

  };

  struct LinkPosition /引入一层封装,其实就是好定义空栈罢了/

  {

   PPosition top;

  };

  typedef struct LinkPosition *PLinkPosition;

PLinkPosition createEmptyPosition(void) /建立空栈/

  {

   PLinkPosition plposition;

   plposition=(PLinkPosition)malloc(sizeof(struct LinkPosition));

   plposition->top=null;

   return(plposition);

  }

void push(PLinkPosition plposition,int x,int y) /压栈/

  {

   PPosition p;

   p=(PPosition)malloc(sizeof(struct Position));

   p->x=x;

   p->y=y;

   p->direction=1;

   p->link=plposition->top;

   plposition->top=p;

  }

void pop(PLinkPosition plposition) /弹栈/

  {

   PPosition p;

   p=plposition->top;

   plposition->top=plposition->top->link;

   free(p);

  }

int judge(PLinkPosition plposition) /判定这个位置是不是栈中已有的/

  {int m,n;

   PPosition p;

   m=plposition->top->x;

   n=plposition->top->y;

   p=plposition->top->link;

  

  

while(p!=null)

   {if(p->x!=mp->y!=n)p=p->link;

   else

   {return(0);

   break;

   }

   }

   return(1);

  }

void maze(void) /画迷宫/

  {

   int i,j;

   setbkcolor(1);

   setcolor(4);

   rectangle(90,50,540,380);

   for(i=80;i<380;i=i+30)

   line(90,i,540,i);

   for(i=120;i<540;i=i+30)

   line(i,50,i,380);

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

   {for(j=0;j<15;j++)

   if(a[i][j]==1)floodfill(105+j*30,65+i*30,4);

   };

  }

void erasermouse(PLinkPosition plposition) /擦除所走过的点/

  {

int x1,y1;

   x1=105+30*(plposition->top->y-1);

   y1=65+30*(plposition->top->x-1);

   setcolor(15);

   line(x1-10,y1,x1+10,y1);

   line(x1,y1-10,x1,y1+10);

   setcolor(4);

  }

void mouse(PLinkPosition plposition) /画出当前位置/

  {

   int x1,y1;

   x1=105+30*(plposition->top->y-1);

   y1=65+30*(plposition->top->x-1);

   line(x1-10,y1,x1+10,y1);

   line(x1,y1-10,x1,y1+10);

  }

void TIMEDELAY() /时间延迟函数,这样动态实现时才可以看清/

  {

   clock_t time;

   time=5+clock();

   while(time>clock());

  }

  main()

  {

   PLinkPosition plposition,answer;

   PPosition p;

   int i,j,d,m,n,m1,n1,x1,y1,driver=VGA,mode=VGAHI;

   int c[13][17]=;

   clock_t times;

   initgraph(&driver,&mode,"");

   for(i=1;i<12;i++)

   for(j=1;j<16;j++)

   c[i][j]=a[i-1][j-1]; /c数组就是给迷宫外层加了一层墙/

   plposition=createEmptyPosition();

   plposition->top->link=null;

   push(plposition,1,1); /压入初始点/

   maze();

   mouse(plposition);

   TIMEDELAY();

   erasermouse(plposition);

   a: /主结构判定并找出路径/

   for(i=plposition->top->direction;i<=9;i++)

   {

   if(i==9)

   {c[plposition->top->x][plposition->top->y]=0;

  

  

pop(plposition);

   mouse(plposition);

   TIMEDELAY();

   erasermouse(plposition);

   goto a;

   }

   m=plposition->top->x;

   n=plposition->top->y;

   m1=m+move[i].x;

   n1=n+move[i].y;

   push(plposition,m1,n1);

   if(c[m1][n1]==0)

   {pop(plposition);

   plposition->top->direction++;

   continue;

   }

   if(judge(plposition)==0)

   {

   pop(plposition);

   continue;

   }

   mouse(plposition);

   TIMEDELAY();

   erasermouse(plposition);

   if(m1==11&&n1==15)break;

   goto a;

   }

   answer=createEmptyPosition(); /由于栈中元素弹出时是从出口到入口的路径,所以把它们反过来/

   p=plposition->top;

   while(p!=null)

   {m=p->x;

   n=p->y;

   push(answer,m,n);

   p=p->link;

   }

   p=answer->top;

   for(i=1;i<25;i++)

   printf(" ");

while(p->link!=null)

  

   printf("(%d,%d)",p->x,p->y);

  getch();

  }

作者:曹开锐 哈尔滨工业

QQ号:185917511(希望爱好c语言的朋友加我啊!)

  

精彩图集

赞助商链接