该题目是一个有几个坑点的题目,容易超时。参考了很多博客,都说BFS不可以,我的BFS没过,用的DFS做的。现在总结几个注意的地方。
1:必须是刚好T的时候到达才可以。
2:可以跨过终点。
3:不可以走回头路。
4:只能用DFS。
只能用DFS的原因是,BFS不可以做到上面的前三点。因为可以跨过终点,又不能走回头路。并且BGS是临点扩张,很可能把需要的点霸占。所以用BFS会产生错误。
下面的代码:
#include <algorithm>
#include <iostream>
#include <cstring>
#include <stdio.h>
#include <string>
#include <vector>
#include <stack>
#include <cmath>
#include <deque>
#include <queue>
#include <map>
using namespace std;
typedef long long ll;
const int MOD = 1e9+7;
#define Foru(i,a,b) for(i = a;i < b;i ++)
#define Ford(i,a,b) for(i = a;i > b; i --)
#define MAXN 100001
struct node{
int i,j,step;
};
int step[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};
char MAP[10][10];
bool book[10][10];
int N,M,T;
node S,D;
/*
4 4 7
S.X.
..X.
..XD
....
4 5 2
.S...
.....
.....
.....
0 0 0
第一个点:可以越过终点
第二个点:不可以走回头路
*/
bool dfs(node stem){
int t = T - stem.step;
if(t== 0){
if(stem.i == D.i && stem.j == D.j){
return true;
}
}
if(t <= 0)return false;
node Stem ;
for(int i = 0;i < 4; i++){
int ti = stem.i + step[i][0],tj = stem.j + step[i][1];
Stem.i = ti,Stem.j = tj,Stem.step = stem.step + 1;
if(ti >= 0&& ti < N&& tj >=0 && tj < M){
if(!book[ti][tj]&& MAP[ti][tj] != 'X'){
book[ti][tj] = true;
bool flag = dfs(Stem);
if(flag)return true;
book[ti][tj] = false;
}
}
}
return false;
}
int main(){
while(scanf("%d%d%d",&N,&M,&T) && (N != 0|| M != 0 || T != 0)){
getchar();
bool flag = 0;
int sum = 0;
S.i = S.j = D.i = D.j = -1;
for(int i = 0;i < N;i ++){
for(int j= 0; j < M; j++){
char ch = getchar();
MAP[i][j] = ch;
if(ch == 'S'){
S.i = i;
S.j = j;
S.step = 0;
}
else if(ch == 'D'){
D.i = i;
D.j = j;
}
else if(ch == 'X'){
sum ++;
}
}
getchar();
}
memset(book,false,sizeof(book));
// bool flag = BFS();
book[S.i][S.j] = true;
if( (T - abs(S.i - D.i ) - abs(D.j - S.j)) % 2 == 0)
flag = dfs(S);
if(flag){
puts("YES");
}
else{
puts("NO");
}
}
return 0;
}