CSDN博客

img avalonBBS

迷宫求解

发表于2004/10/4 22:04:00  1862人阅读

分类: 数据结构手札


/*
  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;
}   

阅读全文
0 0

相关文章推荐

img
取 消
img