您的位置:首页 > 其它

hdu 1010 Tempter of the Bone 回溯

2015-07-26 14:30 375 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010

题意:有只可怜的小狗掉进了陷阱,陷阱有个出口,但只在t秒后开一次,之后就不开了,小狗每走过一个地方就不能再走这个地方了,问小狗能否出去。

思路:看下题目范围,n,m均小于7,回溯,将所有情况全部走一遍,看是否有解。

代码:

#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <cmath>
using namespace std;

int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int N,M,T,sx,sy,ex,ey;
char g[10][10];
bool dfs(int x,int y,int t){
if(t==T) {
if(x==ex&&y==ey) return true;
return false;
}
if(T-t<abs(ex-x)+abs(ey-y) || (T-t-abs(ex-x)+abs(ey-y))%2) return false;

for(int i=0;i<4;i++){
int xx = x+dx[i] , yy = y+dy[i];
if(xx>=0&&xx<N&&yy>=0&&yy<M&&g[xx][yy]!='X'){
g[xx][yy] = 'X';
if(dfs(xx,yy,t+1)) return true;
g[xx][yy] = '.';
}
}
return false;
}
int main(){
while(cin >> N >> M >>T){
if(N+M+T==0) break;
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
cin >> g[i][j];
if(g[i][j]=='S'){
sx = i,sy = j;
g[i][j] = 'X';
}
if(g[i][j]=='D'){
ex = i,ey = j;
}
}
}
if(dfs(sx,sy,0)) printf("YES\n");
else printf("NO\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: