题意:在N*M的图下。问你从S到D是够可以到达在第T秒的时候
解决方法:DFS
注意:两次剪枝
#include<iostream>
#include<cstdio>#include<string.h>
#include<string>
#include<stack>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#define ll __int64
#define lll unsigned long long
#define MAX 50009
#define eps 1e-8
#define INF 0xfffffff
using namespace std;
char ma[9][9];
int n,m,t;
int dx,dy;
int sx,sy;
int flag;
int dir[4][2] = {0,-1,0,1,1,0,-1,0};
void dfs(int x,int y,int cnt)
{
int temp;
if(x<=0||x>n||y<=0||y>m) return ;
if(x==sx&&y==sy&&cnt==t)
{
flag = 1;
return ;
}
//t-cnt是实际还需要的步数
//fabs(x-sx)+fabs(y-sy) 当前点到目标点的距离
temp = (t-cnt) - (fabs(x-sx)+fabs(y-sy));
if(temp<0||temp%2)return ;//如果时间不够或者为奇数一定不可以。
for(int i = 0; i<4; i++)
{
int xx = x + dir[i][0];
int yy = y + dir[i][1];
if(ma[xx][yy]!='X')
{
ma[xx][yy] = 'X';
dfs(xx,yy,cnt+1);
if(flag)return ;
ma[xx][yy] = '.';
}
}
return ;
}
int main()
{
int i,j;
while(~scanf("%d%d%d",&n,&m,&t))
{
if(n==0&&m==0&&t==0)break;
int wall = 0;
flag = 0;
getchar();
for(i = 1; i<=n; i++)
{
for(j = 1; j<=m; j++)
{
scanf("%c",&ma[i][j]);
if(ma[i][j]=='S')
{
dx = i;
dy = j;
}
else if(ma[i][j]=='D')
{
sx = i;
sy = j;
}
else if(ma[i][j]=='X')
{
wall++;
}
}
getchar();
}
if(m*n-wall<=t)
{
puts("NO");
continue;
}
ma[dx][dy] = 'X';
dfs(dx,dy,0);
if(flag)
puts("YES");
else
puts("NO");
}
return 0;
}