4 4 5 S.X. ..X. ..XD .... 3 4 5 S.X. ..X. ...D 0 0 0
NO YES
题目大意:
给定N*M一张图,问你从起点S到终点D不经过障碍物X恰好K步能否到达?
解题思路:
利用回溯法搜索1条路径即可。
但是注意剪枝
(1)如果剩余的步数小于当前位置到终点的绝对距离,肯定不可行
(2)如果剩余的步数相比到终点的位置的绝对距离为奇数,肯定也不可行
解题代码:
#include <iostream>
#include <string>
#include <cmath>
#include <cstdio>
using namespace std;
const int offx[]={0,1,0,-1};
const int offy[]={1,0,-1,0};
int n,m,t;
char str[10][10];
int sx,sy,dx,dy;
void input(){
for(int i=0;i<n;i++) scanf("%s",&str[i]);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(str[i][j]=='S'){
sx=i,sy=j;
}
if(str[i][j]=='D'){
dx=i,dy=j;
}
}
}
}
bool dfs(int x,int y,int step){
int dist=step-abs(x-dx)+abs(y-dy);
if( dist<0 || (dist&1) ) return false; //此处剪枝,如果距离小于0或者距离重点的步数为基数。
if(step<=0){
if(abs(x-dx)+abs(y-dy)==0) return true;
else return false;
}
for(int i=0;i<4;i++){
int x0=x+offx[i],y0=y+offy[i];
if(x0<0||x0>=n||y0<0||y0>=m) continue;
if(str[x0][y0]=='X' || str[x0][y0]=='S' || (step>1&&str[x0][y0]=='D') ) continue;
str[x0][y0]='X';
if(dfs(x0,y0,step-1) ) return true;
str[x0][y0]='.';
}
return false;
}
void solve(){
if(dfs(sx,sy,t)) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
int main(){
while( scanf("%d%d%d",&n,&m,&t)!=EOF && (m||n||t)){
input();
solve();
}
return 0;
}
HDU 1010 Tempter of the Bone,布布扣,bubuko.com
原文:http://blog.csdn.net/a1061747415/article/details/26453333