//base.h
#include
#include
#include
#define overflow -2
#define ok 1
#define error 0
#define true 1
#define false 0
typedef int status;
//stack.h
#define stack_init_size 100 //儲存空間初始量
#define stack_increment 10//儲存空間初始增量
typedef struct
posttype;//座標位置 迷宮的r行c列
typedef struct
selemtype;//棧元素的型別
typedef struct
stack;//棧的型別
status initstack(stack &s)//初始化棧
//initstack
status stackempty(stack s)
//判斷棧是否為空,如果為空返回true,否則返回false
//stackempty
status push(stack &s,selemtype e)
//插入元素為e的棧頂元素
*s.top++=e;
return ok;
}//push
status pop(stack &s,selemtype &e)
//刪除棧頂元素存入e
//pop
status destroystack(stack &s)
//銷毀棧
//destroystack
//maze.cpp
#define maxlen 20//迷宮包括外牆最大行列數目
typedef structmazetype; //迷宮型別
status initmaze(mazetype &maze)//for
for(i=0;i<=maze.r+1;i++)
for(i=1;i<=maze.r;i++)
for(j=1;j<=maze.c;j++)
maze.adr[i][j]=' ';//初始化迷宮
printf("輸入障礙物%d的座標(以座標(0,0)結束輸入): ",k);
scanf("%d%d",&m,&n);//接收障礙的座標
k++;
while(m!=0)
return ok;
}//initmaze
status pass(mazetype maze,posttype curpos)//pass
status footprint(mazetype &maze,posttype curpos)//footprint
posttype nextpos(posttype &curpos,int i)
return cpos;
}//nextpos
status markprint(mazetype &maze,posttype curpos)//markprint
void printmaze(mazetype &maze)
//將最後標記好的迷宮輸出
}//printmaze
status mazepath(mazetype &maze,posttype start,posttype end)
//若迷宮從入口start到end的通道則求得一條存放在棧中
else
}//if
else//當前位置不能通過
if(e.di<4)//換下乙個方向探索 設定當前位置為該新方向上的鄰位
}//if
}}while(!stackempty(s));
if(!destroystack(s))
exit(error);
else return false;
}//mazepath
void main()
dowhile (start.r>maze.r || start.c>maze.c);
dowhile (end.r>maze.r || end.c>maze.c);
if(!mazepath(maze,start,end))
printf("/n不能找到一條路徑!!!/n");
else printmaze(maze);//輸出迷宮
printf("是否要繼續?(y/n):");
scanf("%s",&c);
}while (c=='y' || c=='y');
}//main//base.h
#include
#include
#include
#define overflow -2
#define ok 1
#define error 0
#define true 1
#define false 0
typedef int status;
//stack.h
#define stack_init_size 100 //儲存空間初始量
#define stack_increment 10//儲存空間初始增量
typedef struct
posttype;//座標位置 迷宮的r行c列
typedef struct
selemtype;//棧元素的型別
typedef struct
stack;//棧的型別
status initstack(stack &s)//初始化棧
//initstack
status stackempty(stack s)
//判斷棧是否為空,如果為空返回true,否則返回false
//stackempty
status push(stack &s,selemtype e)
//插入元素為e的棧頂元素
*s.top++=e;
return ok;
}//push
status pop(stack &s,selemtype &e)
//刪除棧頂元素存入e
//pop
status destroystack(stack &s)
//銷毀棧
//destroystack
//maze.cpp
#define maxlen 20//迷宮包括外牆最大行列數目
typedef structmazetype; //迷宮型別
status initmaze(mazetype &maze)//for
for(i=0;i<=maze.r+1;i++)
for(i=1;i<=maze.r;i++)
for(j=1;j<=maze.c;j++)
maze.adr[i][j]=' ';//初始化迷宮
printf("輸入障礙物%d的座標(以座標(0,0)結束輸入): ",k);
scanf("%d%d",&m,&n);//接收障礙的座標
k++;
while(m!=0)
return ok;
}//initmaze
status pass(mazetype maze,posttype curpos)//pass
status footprint(mazetype &maze,posttype curpos)//footprint
posttype nextpos(posttype &curpos,int i)
return cpos;
}//nextpos
status markprint(mazetype &maze,posttype curpos)//markprint
void printmaze(mazetype &maze)
//將最後標記好的迷宮輸出
}//printmaze
status mazepath(mazetype &maze,posttype start,posttype end)
//若迷宮從入口start到end的通道則求得一條存放在棧中
else
}//if
else//當前位置不能通過
if(e.di<4)//換下乙個方向探索 設定當前位置為該新方向上的鄰位
}//if
}}while(!stackempty(s));
if(!destroystack(s))
exit(error);
else return false;
}//mazepath
void main()
dowhile (start.r>maze.r || start.c>maze.c);
dowhile (end.r>maze.r || end.c>maze.c);
if(!mazepath(maze,start,end))
printf("/n不能找到一條路徑!!!/n");
else printmaze(maze);//輸出迷宮
printf("是否要繼續?(y/n):");
scanf("%s",&c);
}while (c=='y' || c=='y');
}//main
a 演算法迷宮 c 迷宮中的老鼠
之前我們已經討論了採用回溯 backtracking 方法來解決西洋棋中馬的遍歷問題。為了讓大家更加熟悉回溯方法,我們將在後面的課程中再分析幾個例子。今天先看乙個使用回溯方法解決老鼠走迷宮的問題。下圖是乙個迷宮,其中塗上灰色的方格,老鼠不能進入,請找出老鼠從起點到終點的線路。老鼠只能向兩個方向移動 ...
關於迷宮的路徑輸出
怕 會有忽略所以全發了上來,麻煩各位 不知道為什麼,總是無法輸出尋得的路徑,用printf 檢測無法進入if i g utexit.x j g utexit.y 中 include include include include include include 匯入聲音標頭檔案 include pr...
求迷宮的的演算法
include include include include include include define maxn 100 using namespace std int q maxn maxn int maze maxn maxn fa maxn maxn vis maxn maxn dist...