1. 程式人生 > >資料結構練習題――Hero In Maze 簡單版(JSU-ZJJ)

資料結構練習題――Hero In Maze 簡單版(JSU-ZJJ)

題目描述

500年前,Jesse是我國最卓越的劍客。他英俊瀟灑,而且機智過人_
突然有一天,Jesse心愛的公主被魔王困在了一個巨大的迷宮中。Jesse聽說這個訊息已經是兩天以後了,他急忙趕到迷宮,開始到處尋找公主的下落。
請你判斷他是否能救出心愛的公主。(假設有路可以通到公主那就可以找到公主)。
輸入
題目包括多組測試資料。
每組測試資料以兩個整數n,m(0<n, m≤20)開頭,分別代表迷宮的長和高。緊接著有m行,n列字元,由".","",“P”,"S"組成。其中
“.” 代表能夠行走的空地。
"
" 代表牆壁,Jesse不能從此通過。
“P” 是公主所在的位置。
“S” 是Jesse的起始位置。
Jesse只能選擇“上、下、左、右”任意一方向走一步。
輸入以0 0結束。
輸出
如果能救出公主輸出“YES”,否則輸出“NO”。

分析:

本題十分明顯的深搜,不過,對於我這種剛學深索不久的人來說。 本題的難度還是十分大的。本題的思路大致就是為全部依次走,如果能找到公主,就可以推出了;
如下程式碼:


#include"stdio.h"
int px,py,n,m,biaoji;char a[25][25],t;
int dfs(int sx,int sy)
    {  if(sx<0||sy<0||sx>=m||sy>=n||px<0||py<0||px>=m||py>=n||a[sx][sy]=='*')/*代表這個點不可以被走,所以退出來*/
          return 0;
       if(sx==px&&sy==py)//代表到了終點
          return 1;
      a[sx][sy]='*';//經過上面兩個if後,代表著這個點可走。此為標記為舊點

       if(dfs(sx-1,sy)==1)//向上走
          return 1;
    //   if(sx-1>=0)
      // a[sx-1][sy]='*';
    //  a[sx][sy]='*';
    //   if(biaoji==0)
       if(dfs(sx+1,sy)==1)
          return 1;
   //   if(sx+1<n)
   //    a[sx+1][sy]='*';
  //  a[sx][sy]='*';
  //  if(biaoji==0)
       if(dfs(sx,sy-1)==1)
          return 1;
    //  if(sy-1>=0)
    //   a[sx][sy-1]='*';
  //   a[sx][sy]='*';
    // if(biaoji==0)
       if(dfs(sx,sy+1)==1)
          return 1;
    //   if(sy+1<m)
   //    a[sx][sy+1]='*';
     // a[sx][sy]='*';
   return 0;/*/如果上面操作,未能return,則表示這個點不能到達公主那。直接return 0到上一個遞迴。考慮*/
    }
int main()
{

    int sx,sy,i,j;
    while(~scanf("%d%d",&n,&m))
    {if(n==0&&m==0)
        break;
      biaoji=0;
    //  for(i=0;i<25;i++)
    //      for(j=0;j<25;j++)
    //  {
    //      a[i][j]='.';
    //  }
    //  printf("%d %d\n",n,m);
        scanf("%c",&t);
        for(i=0;i<m;i++)
        {for(j=0;j<n;j++)
               {scanf("%c",&a[i][j]);
                if(a[i][j]=='S')
                {
                    sx=i;sy=j;
                }
                if(a[i][j]=='P')
                {
                    px=i;py=j;
                }

               }
                 scanf("%c",&t);
        }
   //printf("%d %d\n%d %d\n",sx,sy,px,py);
     /*   for(i=0;i<n;i++)
        {for(j=0;j<m;j++)
           printf("%c ",a[i][j]);
           printf("\n");}*/
      if(dfs(sx,sy)==1)
         printf("YES\n");
      else
         printf("NO\n");


    }
}