1.规定时间走到出口,减时:每走一步减一秒
2.t == 0 时为出口yes,t == 0时不为出口No!
3.剪枝:T - 最短路 为奇数:NO
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int N,M,m,n,p,q;
char a[10][10]; /// 存地图
bool vis[10][10]; /// 标记是否走过
int dir[][2] = {{1,0},{0,1},{0,-1},{-1,0}}; /// 方向
#include<cstring>
#include<algorithm>
using namespace std;
int N,M,m,n,p,q;
char a[10][10]; /// 存地图
bool vis[10][10]; /// 标记是否走过
int dir[][2] = {{1,0},{0,1},{0,-1},{-1,0}}; /// 方向
bool dfs(int x, int y, int T)
{
int nx,ny,i;
{
int nx,ny,i;
if (a[x][y] == 'D' && T==0) /// 时间到 正好走到出口 YES
return true;
else if(a[x][y] != 'D' && T!=0) /// 时间不到没走到出口 继续走
{
for(i=0; i<4; i++)
{
//cout<<"1 nx: "<<nx<<" ny:"<<ny<<" x:"<<x<<" y:"<<y<<endl;
nx = x + dir[i][0]; /// 新走一步
ny = y + dir[i][1];
//cout<<"2 nx: "<<nx<<" ny:"<<ny<<endl;
if(0<=nx && nx<N && 0<=ny && ny<M && a[nx][ny]!='X'&& !vis[nx][ny]) /// 没出界 & 不为墙 & 没走过
{
vis[nx][ny] = true; /// 标记为走过
//cout<<"x:"<<nx<<" y:"<<ny<<" i:"<<i<<" k:"<<k<<endl;
if(dfs(nx, ny, T-1)) /// 递归看下一步是否可行
return true; /// 下步可行 则 此步可行 返回1
else
return true;
else if(a[x][y] != 'D' && T!=0) /// 时间不到没走到出口 继续走
{
for(i=0; i<4; i++)
{
//cout<<"1 nx: "<<nx<<" ny:"<<ny<<" x:"<<x<<" y:"<<y<<endl;
nx = x + dir[i][0]; /// 新走一步
ny = y + dir[i][1];
//cout<<"2 nx: "<<nx<<" ny:"<<ny<<endl;
if(0<=nx && nx<N && 0<=ny && ny<M && a[nx][ny]!='X'&& !vis[nx][ny]) /// 没出界 & 不为墙 & 没走过
{
vis[nx][ny] = true; /// 标记为走过
//cout<<"x:"<<nx<<" y:"<<ny<<" i:"<<i<<" k:"<<k<<endl;
if(dfs(nx, ny, T-1)) /// 递归看下一步是否可行
return true; /// 下步可行 则 此步可行 返回1
else
vis[nx][ny] = false; /// 下步不可行 则 此步不可行 取消标记
}
}
}
}
return false; /// 下步不可行 则 此步不可行 返回0
}
else /// 时间不到出口到 或 出口不到时间到 NO
return false;
}
else /// 时间不到出口到 或 出口不到时间到 NO
return false;
}
bool jz(int T)
{
if((T-(abs(m-p)+abs(n-q)))%2 != 0) /// 提前判断:
return false;
else /// T - (最短路)为奇数时
return true;
} /// 一定不可能 !!!!
int main()
{
int T;
while(cin>>N>>M>>T)
{
memset(vis,false,sizeof(vis));
if(N == 0 && M == 0 && T == 0)
return 0;
else
{
for(int i=0; i<N; i++)
for(int j=0; j<M; j++)
{
cin>>a[i][j];
if(a[i][j] == 'S') /// 记录开始位置 用于剪枝和起始传参
{
m=i;
n=j;
}
if(a[i][j] == 'D') /// 记录出口的位置 用于剪枝
{
p=i;
q=j;
}
int T;
while(cin>>N>>M>>T)
{
memset(vis,false,sizeof(vis));
if(N == 0 && M == 0 && T == 0)
return 0;
else
{
for(int i=0; i<N; i++)
for(int j=0; j<M; j++)
{
cin>>a[i][j];
if(a[i][j] == 'S') /// 记录开始位置 用于剪枝和起始传参
{
m=i;
n=j;
}
if(a[i][j] == 'D') /// 记录出口的位置 用于剪枝
{
p=i;
q=j;
}
}
vis[m][n] = true; /// 标记起始位置
if(jz(T) && dfs(m,n,T)) /// 剪枝放前
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
vis[m][n] = true; /// 标记起始位置
if(jz(T) && dfs(m,n,T)) /// 剪枝放前
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
return 0;
}