王子救公主

题目描述

可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。魔王已经发出消息说将在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");


    }
}


猜你喜欢

转载自blog.csdn.net/qq_43506138/article/details/84332602