题意:一只狗狗去迷宫找宝藏被骗了,然后迷宫开始塌陷,第t秒时们会开一下,而且每块陆地他只能待一秒,问他能不能逃走。
题解:看到n<7&m<7果断写了一个dfs,然后超时了。。
这题需要剪枝,很久没遇到剪枝的dfs了,好像我也只会写最简单的dfs了,奇偶剪枝,算一下当前点到终点的曼哈顿距离,和当前时间和t的差值,如果两者就不同,肯定无法在t秒到达。因为一个点到另一个点如果距奇偶数确定,那么他无论怎么走当到达终点是,走的步数奇偶性一定和原来一样。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
int n,m,t;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int vis[10][10];
char s[10][10];
int sx,sy,ex,ey;
int flag;
void dfs(int x,int y,int time)
{
if(flag)return ;
if(time>t)return ;
if(x<1||x>n||y<1||y>m)return ;
if(time==t&&s[x][y]=='D')
{
flag=1;return ;
}
int temp=t-time-abs(ex-x)-abs(ey-y);
if(temp&1) return ;
for(int i=0;i<4;i++)
{
int x1=x+dx[i],y1=y+dy[i];
if(!vis[x1][y1]&&s[x1][y1]!='X')
{
vis[x1][y1]=1;
dfs(x1,y1,time+1);
vis[x1][y1]=0;
}
}
return ;
}
int main()
{
while(scanf("%d%d%d",&n,&m,&t)!=EOF)
{
if(n==0||m==0||t==0)break;
memset(vis,0,sizeof(vis));
memset(s,0,sizeof(s));
for(int i=1;i<=n;i++)
{
scanf("%s",s[i]+1);
for(int j=1;j<=m;j++)
{
if(s[i][j]=='S')
{
sx=i;sy=j;vis[i][j]=1;
}
if(s[i][j]=='D')
{
ex=i;ey=j;
}
}
}
flag=0;
dfs(sx,sy,0);
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}