本题为一道搜索题目,题目对的大致意思是在规定的时间内狗狗能不能走出这个房间,首先要找出房间的入口和出口在哪里。接着就是对其的深度优先搜索了,不算太难。
下面附上本渣渣的AC代码。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int n,m,t,ok;
char a[10][10];
int sx,sy,ex,ey;
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
void dfs(int x,int y,int cnt)
{
int i;
if(cnt==t)
{
if(ex==x&&ey==y)
{
ok=1;
}
return ;
}
if(ok==1)//找到解后停止搜索
return ;
int temp=abs(x-ex)+abs(y-ey)-abs(cnt-t);//剪枝2:((((要点)))) //奇偶性剪枝 ,起点和终点确定以后就可以确定走的步数是奇数还是偶数,通过这个特点来剪枝,,,这是某位大神的杰作...
if(temp>0||temp&1)
return ;
for(i=0;i<4;i++)
{
int fx=x+dir[i][0];
int fy=y+dir[i][1];
if(fx>=0&&fx<n&&fy>=0&&fy<m&&a[fx][fy]!='X')
{
a[fx][fy]='X';
dfs(fx,fy,cnt+1);
a[fx][fy]='.';//回溯
}
}
}
int main()
{
while(cin>>n>>m>>t)
{
if(m==0||n==0||t==0)
break;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
int wall=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(a[i][j]=='S')
{
sx=i;sy=j;
}
else if(a[i][j]=='D')
{
ex=i;ey=j;
}
else if(a[i][j]=='x')
{
wall++;
}
}
}
ok=0;
a[sx][sy]='X';
dfs(sx,sy,0);
if(m*n-wall<=t)//剪纸一
{
printf("NO\n");
}
else
{
if(ok==1)
printf("YES\n");
else printf("NO\n");
}
}
return 0;
}