迷宫求解

原创 2004年10月04日 22:04:00


/*
  Name: 迷宫求解
  Author: avalon
  Date: 04-10-04 22:00
  Description: "stack.h"是我的一个泛型堆栈.整个程序是用了一个二维结构数组做
      为基础的.
*/

#include "stack.h"
#include <stdio.h>
#include <stdlib.h>

/*行,列*/
#define HAN   10
#define LIE   10
/**/
typedef enum{
     BLACK  =  -1,  /*表示黑色的块(不可通)*/
  WHITE  =   1,  /*白块(可通)*/
  BEGIN  =  -2,  /*开始点*/
  END    =   2,  /*结束点*/
  ERROR  =  -3,  /*经过探测不可用*/
  OK     =   3   /*经过探测*/
}ELEM;

typedef struct Map{/*迷宫图*/ 
 ELEM elem ;    /*表示状态*/ 
 int x;
 int y;         /*结构坐标*/ 
}Map;
Map  map[HAN][LIE];

BOOL NextPath(int *x,int *y)
{/*进入下一步路径(修改结构数组)如果可行则返回TRUE*/ 
 if(map[*x][*y].x !=0){/*上*/
  if(map[*x-1][*y].elem ==WHITE ||
   map[*x-1][*y].elem==BEGIN ||
   map[*x-1][*y].elem==END){
   (*x)--; 
   return TRUE;
  }
 }
 if(map[*x][*y].x != HAN-1){/*下*/
  if(map[*x+1][*y].elem ==WHITE ||
   map[*x+1][*y].elem==BEGIN ||
   map[*x+1][*y].elem==END){
   (*x)++;
   return TRUE;
  }
 }
 if(map[*x][*y].y != 0){/*左*/
  if(map[*x][*y-1].elem ==WHITE ||
   map[*x][*y-1].elem==BEGIN ||
   map[*x][*y-1].elem==END){
   (*y)--;
   return TRUE;
  }
 }
 if(map[*x][*y].y != LIE-1){/*右*/
  if(map[*x][*y+1].elem ==WHITE ||
   map[*x][*y+1].elem==BEGIN ||
   map[*x][*y+1].elem==END){
   (*y)++;
   return TRUE;
  }
 }
 /***** FT!!!!!!!!!****/     
 return FALSE;
}          
BOOL MazePath(void)
{/*先要保证结构数据的正确性~
 若迷宫存在从起点到终点的通道,则求得一条存放在栈中,并返回TRUE*/
 StackHandle s;
 struct Map  temp;
 int i,j;
 void  PrintMap(void);/**/
 s=InitStack(sizeof(struct Map));/*用结构来初始化 栈*/
 
 for(i=0;i<HAN;i++){/*寻找开始点*/
  for(j=0;j<LIE;j++){
   if(map[i][j].elem == BEGIN)          
    goto ok;        
  }
 }
ok:
 do{
  if(NextPath(&i,&j)){/*探索下一路径*/
   Push(s,&map[i][j]);
   if(map[i][j].elem==END){
    return OK;
   }
   map[i][j].elem=OK;
  }
  else{/*当前是死路*/
   if(!StackEmpty(s)){
    Pop(s,&temp);/*回到上一步*/
    map[i][j].elem=ERROR;
    i=temp.x;
    j=temp.y;
   }
   else return FALSE;
  }
 }while(!StackEmpty(s));
 DestroyStack(&s);
 return FALSE;

void  PrintMap(void)/**/
{/*图的打印输出*/
 int i,j;
 printf("开始输出(O为白块,X为黑块,B为开始位置,E为结束位置:/n");
 getchar();
 for(i=0;i<HAN;i++){
  for(j=0;j<LIE;j++){
   if(map[i][j].elem == WHITE)
    printf(" O ");                
   else if(map[i][j].elem == BLACK)
    printf(" X ");
   else if(map[i][j].elem == BEGIN)
    printf(" B ");
   else if(map[i][j].elem == END)
    printf(" E ");
   else if(map[i][j].elem == OK)
    printf(" @ "); 
   else printf(" ! ");
  }
  printf("/n");
 }
}           

void  InputMap(void)/**/
{   
 char input;
 int  i,j;   
 
 printf("迷宫共为%d行%d列,开始输入:/n",HAN,LIE);
 for(i=0;i<HAN;i++){
  for(j=0;j<LIE;j++){
   (map[i][j]).x    = i;
   (map[i][j]).y    = j;   
   (map[i][j]).elem = WHITE;
   printf("第%d行%d列是白块?(/'Y/'or/'y/'为确认):",
    i+1,j+1 );           
   while( (input=getchar()) != '/n'){
    if(input=='y' || input=='Y')
     (map[i][j]).elem = WHITE;
    else
     (map[i][j]).elem = BLACK;
   }          
  }         
 }/* for end*/
 while(1){
  printf("/n输入开始位置(2位数表示:");
  scanf("%d",&i);
  if( !(i >0 && i<=99))printf("error!");
  else if( !(i > LIE && i<=HAN*10+LIE))
   printf("坐标超出范围/n");
  else if(  map[i/10-1][i%10-1].elem ==BLACK)
   printf("起始点不能为黑块!/n");
  else {
   map[i/10-1][i%10-1].elem=BEGIN;
   break;
  }
 }
 while(1){
  printf("/n输入结束位置(2位数表示:");
  scanf("%d",&i);
  if( !(i > LIE && i<=HAN*10+LIE))
   printf("坐标超出范围/n");
  else if(  map[i/10-1][i%10-1].elem ==BLACK)
   printf("起始点不能为黑块!/n");
  else {
   map[i/10-1][i%10-1].elem=END;
   break;
  }   
  printf("/n输入结束!"); 
  getchar();
  system("cls");   
 }  
}
int main(void)
{   
 InputMap();
 PrintMap(); 
 printf("/n======================================================/n");
 if(MazePath())
  PrintMap();
 else printf("无路径!!!!");
 system("PAUSE");
 return 0;
}   

迷宫求解!

问题:从迷宫的入口找到通向出口的路径。   算法:为了描述迷宫的布局,将定义迷宫的数组m[][]设为全局变量以减少形参传递。另外还需要一个结构体来描述迷宫足迹的坐标,定义如下:     stru...
  • kkkkkxiaofei
  • kkkkkxiaofei
  • 2012年12月19日 21:31
  • 5912

迷宫求解 《数据结构——严蔚敏》

  在学《数据结构——严蔚敏》,自己动手写了 迷宫求解 的实现!为了方便,C和C++部分混写了= =!稍稍修改了点地方/****************************************...
  • dly553709938
  • dly553709938
  • 2010年09月26日 00:46
  • 5281

迷宫求解java解决方案

对于迷宫求解问题不是一个常规的遍历问题。在路径的叠加中要不端的判断点的连通性。在数据结构教材上有通用的解法 eg:迷宫 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 0, 1, 1...
  • aiyijingaiyujie
  • aiyijingaiyujie
  • 2016年08月05日 22:59
  • 399

【数据结构实验】编制一个程序求解迷宫通路

#include #include using namespace std; #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #...
  • qq_32353771
  • qq_32353771
  • 2015年11月10日 14:18
  • 2185

数据结构——迷宫求解

效果如下: 源代码如下: #include #include #include #define M 100 #define ERROR 0  #define OK 1 ...
  • tianse12
  • tianse12
  • 2015年07月28日 15:37
  • 656

数据结构例程——迷宫问题(用栈结构)

本文针对数据结构基础系列网络课程(3):栈和队列中第6课时栈的应用2-迷宫问题。例:求出从入口到出口的路径 程序实现:#include #define MaxSize 100 #define M ...
  • sxhelijian
  • sxhelijian
  • 2015年09月15日 11:41
  • 12539

(数据结构)栈_迷宫求解(严蔚敏P50) _模仿

一般方法: #include"ds.h" #define MAX_COLUM 10 //迷宫最大列数 #define MAX_ROW 10 //迷宫最大行数 #define MAX_NUM 10...
  • u013080459
  • u013080459
  • 2014年01月12日 11:32
  • 1271

C++栈实现数据结构中的迷宫求解

利用顺序栈实现数据结构中的迷宫求解问题 首先初始化一个二维数组vector>,将障碍物标记为-1,为走过的点标记为0,走过的点标记为1 从入口地址开始,依次按上下左右四个方向寻找是否有可以通行的点,如...
  • longjingwen12345
  • longjingwen12345
  • 2016年11月25日 12:47
  • 1327

C语言实现迷宫求解

最近做了一个用C语言迷宫求解的题目,来分享一下。 题目要求://迷宫的布局放入到一个二维的数组中 1代表该地方走不通为墙,0代表该地方可以走通,打印出来走的顺序  //0 , 1 , 2 , 3 ...
  • u010889616
  • u010889616
  • 2015年04月12日 11:36
  • 2139

数据结构(7)—栈的应用之迷宫求解

参考书籍:数据结构(C语言版)严蔚敏吴伟民编著清华大学出版社 1.问题描述: 采用“穷举求解”方法,从入口出发,顺某一方向向前探索,若能走通,则继续往前走;否则沿原路返回,换一个方向再继续探索。为...
  • u010366748
  • u010366748
  • 2016年02月21日 01:23
  • 926
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:迷宫求解
举报原因:
原因补充:

(最多只允许输入30个字)