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 的功能可是很強大的呢!
在此,只是介紹它一部分的力量。
希望大家會喜歡。






沒有留言:

張貼留言