hdu1010 发表于 2018-11-06 | 分类于 题解 | 阅读数 次 链接:hdu1010 题解 简单dfs+奇偶剪枝 1234567891011121314151617181920212223242526272829303132333435363738394041424344#include<iostream>#include<cstdlib>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#define rep(i,x,y) for(register int i=x;i<=y;++i)#define repd(i,x,y) for(register int i=x;i>=y;--i)#define ll long longusing namespace std;const int N=20;pair<int,int> S,D;char mp[N][N];int vis[N][N],n,m,T;int dx[5]={0,-1,1,0,0};int dy[5]={0,0,0,-1,1};inline int dis(int x,int y){return abs(x-D.first)+abs(y-D.second);}int dfs(int x,int y,int c){ if(c==T&&mp[x][y]=='D')return 1; int t=T-dis(x,y)-c;s if(c>=T||t<0||t&1)return 0; rep(i,1,4){ int nx=x+dx[i]; int ny=y+dy[i]; if(nx<1||nx>n||ny<1||ny>m||mp[nx][ny]=='X'||vis[nx][ny])continue; vis[nx][ny]=1; if(dfs(nx,ny,c+1))return 1; vis[nx][ny]=0; } return 0;}int main(){ while(~scanf("%d%d%d",&n,&m,&T)&&n){ memset(vis,0,sizeof vis); rep(i,1,n)scanf("%s",mp[i]+1); rep(i,1,n)rep(j,1,m){ if(mp[i][j]=='S')S=make_pair(i,j); if(mp[i][j]=='D')D=make_pair(i,j); } vis[S.first][S.second]=1; puts(dfs(S.first,S.second,0)?"YES":"NO"); } return 0;}