2012年5月25日 星期五
C# -> 走迷宮程式
這裡有一座迷宮......
<Start>
##############
#A #
####### ######
# #
## ######## ##
# #
##############
<Next>
<End>
'A'代表你的位置,'#'代表牆壁,空白處代表可以走的路。
邊邊有一格是空白的,那就是出口。
現在我們要做的事,就是看看你如何走出這個迷宮。
我們在這邊要用到一個演算法 - BFS(廣度優先搜索)
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
char map[101][101],spp[101] ;
int dis[101][101],sp[101][101] ;
int dx[4]={0,0,-1,1},dy[4]={1,-1,0,0} ;
int n=0,m=0,i=0,j=0,k=0,pass=0,to=0,noway=0,nw_count=0 ;
void prt(void) //把當前得地圖狀態列印出來
{
printf("No.%d >>\n",to) ;
for(int ix=0;ix<n;ix++){
for(int jx=0;map[ix][jx]!='\0';jx++){
if(sp[ix][jx]==1)
printf("%c",'A') ;
else if(sp[ix][jx]==2 || map[ix][jx]=='.')
printf("%c",' ') ;
else
printf("%c",'#') ;
}
printf("\n") ;
}
for(int ix=0;ix<22-n;ix++)printf("\n") ;
getch() ;
}
int main()
{
FILE *fp ;
fp=fopen("data.txt","r") ;//在這裡我們用讀取txt檔的方式來輸入資料,因為迷宮可能會有很多座
while(fscanf(fp,"%s",spp)!=EOF){
if(spp[1]=='E')break ;
else if(spp[1]=='S'){ //如果是<START>那麼就把迷宮讀入
for(i=0;i<101;i++)
for(j=0;j<101;j++)map[i][j]='\0' ;
for(m=0;;m++){
fscanf(fp,"%s",map[m]) ;
if(map[m][1]=='N'){ //如果是<NEXT>那麼就開始分析迷宮,並解開。
n=m;
for(i=0;map[m][i]!='\0';map[m][i++]='\0');
break;
}
}
}
for(i=0;i<n;i++){
for(j=0;map[i][j]!='\0';j++){
dis[i][j]=sp[i][j]=0 ;
if(map[i][j]=='A')sp[i][j]=1 ; //標記你的位置
}
}
to=noway=pass=0 ;
while(!pass)
{
prt() ;
for(i=0;i<n;i++){
for(j=0;map[i][j]!='\0';j++){
if(sp[i][j]==1){ //如果你走過,就看看上、下、左、右是否還有路或沒走過的路要走。
for(k=0;k<4;k++){
if(map[i+dy[k]][j+dx[k]]=='.'){ //我們用'.'來代替space
if(!sp[i+dy[k]][j+dx[k]]){
sp[i+dy[k]][j+dx[k]]=-1 ;
dis[i+dy[k]][j+dx[k]]=dis[i][j]+1 ;
to=dis[i][j]+1 ;
}
}
else if(map[i+dy[k]][j+dx[k]]=='\0' || !i || !j){
pass=1 ;
to=dis[i][j] ;
break ;
}
}
sp[i][j]=2 ;
}
if(pass)break ;
}
if(pass)break ;
}
if(!pass)noway=1 ;
for(i=0;i<n;i++){
for(j=0;map[i][j]!='\0';j++){
if(sp[i][j]==-1){
sp[i][j]=1 ;
noway=0 ;
}
}
}
if(!pass)pass=noway ;
}
if(!noway){
printf("%d Steps\n",to) ; //找到出路! 列印出你走了幾步。
}
else{
printf("走不出去啊!\n你耍我!?\n") ; //所有路都走過了,可是就是走不出去> <!
}
getch() ;
}
printf("THE END\n") ;
getch() ;
return 0 ;
}
BFS 的功能可是很強大的呢!
在此,只是介紹它一部分的力量。
希望大家會喜歡。
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言