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