1. 程式人生 > >王子救公主

王子救公主

題目描述

可憐的公主在一次次被魔王擄走一次次被騎士們救回來之後,而今,不幸的她再一次面臨生命的考驗。魔王已經發出訊息說將在T時刻吃掉公主,因為他聽信謠言說吃公主的肉也能長生不老。年邁的國王正是心急如焚,告招天下勇士來拯救公主。不過公主早已習以為常,她深信智勇的騎士LJ肯定能將她救出。
現據密探所報,公主被關在一個兩層的迷宮裡,迷宮的入口是S(x, y),公主的位置用P表示。
輸入
測試資料多組。輸入n, m;表示nm的迷宮, S為入口,P為公主位置,”“表示可以通行,”.“表示不可通行。
輸出
如果王子可以順利救到公主輸出王子救到公主的最短距離,和YES。如果不行輸出NO
樣例輸入
3 4
S…*


***P
樣例輸出
5
YES

分析:

本題與其他深搜問題沒什麼大的區別。本題也可以用bfs做。



#include"stdio.h"
int px,py,n,m,biaoji;
char a[25][25],t;
int min1,count;
int min(int a,int b)
    {
        if(a<b)
            return a;
        else
            return b;
    }
int dfs(int sx,int sy,int count)
    {  if(sx<0||sy<0||sx>=n||sy>=m||px<0||py<0||px>=n||py>=m||a[sx][sy]=='.')
          return 0;
       if(sx==px&&sy==py)
          {

           min1=min(min1,count);
           return 0;
          }
      a[sx][sy]='.';

       dfs(sx-1,sy,count+1);
       //   return 1;
    //   if(sx-1>=0)
      // a[sx-1][sy]='*';
    //  a[sx][sy]='*';
    //   if(biaoji==0)
       dfs(sx+1,sy,count+1);
       //   return 1;
   //   if(sx+1<n)
   //    a[sx+1][sy]='*';
  //  a[sx][sy]='*';
  //  if(biaoji==0);
       dfs(sx,sy-1,count+1);
      //    return 1;;
    //  if(sy-1>=0)
    //   a[sx][sy-1]='*';
  //   a[sx][sy]='*';
    // if(biaoji==0)
       dfs(sx,sy+1,count+1);
       //   return 1;
    //   if(sy+1<m)
   //    a[sx][sy+1]='*';
      a[sx][sy]='*';
   return 0;
    }
int main()
{

    int sx,sy,i,j;
    while(~scanf("%d%d",&n,&m))
    {min1=1000;count=0;
     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<n;i++)
        {for(j=0;j<m;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");}*/
      dfs(sx,sy,count);
      if(min1!=1000)
         { printf("%d\n",min1);
             printf("YES\n");}
      else
         printf("NO\n");


    }
}