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;
}
题意:有只可怜的小狗掉进了陷阱,陷阱有个出口,但只在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;
}
相关文章推荐
- 在局域网内如何访问另一台计算机
- java Ip地址的获取 简单代码
- Menu 菜单
- CSS3 calc()的使用
- js获取节点
- 函数调用的冒泡排序
- 黑马程序员——Java基础-图形界面
- 冒泡,简单选择,直接插入排序比较(Java版)
- springmvc的restful服务理解
- 【峰回路转】Excel技巧百例 01.对比两列数据,然后根据数据升降给出相关标识
- 设计与实现模块管理系统基本功能定义自己(18--设计模块附件[1])
- [LeetCode] Kth Smallest Element in a BST
- CodeVS第一次月赛
- php中0与空 Null false的区别
- Swift学习笔记(三)——布尔类型与if条件判断
- 刷脸支付火热 央行担忧安全风险
- MYSQL---MD5()、PASSWORD()函数
- 九度oj 1083
- Prim — 最小生成树
- SERDES总结