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