最近在练习搜索,可能自己的算法太渣了,所以这个题如果不剪枝就超时,剪枝了也要600MS
关于此题的剪枝,看了很多题解,觉得这个题解是讲的最清楚的——》点击打开
至于思路是:
1.奇偶剪枝
2.step超限的话,直接忽略之后的路径。
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
#define MAXN 7
int n, m,t,rec[MAXN][MAXN],vis[MAXN][MAXN],mark,ssmark;
void dfs(int si, int sj, int step){
if (step>t || si < 0 || si >= n || sj < 0 || sj >= m || vis[si][sj] == 1){
mark = 1;
return;
}
vis[si][sj] = 1;
if (step == t && rec[si][sj] == -3){
ssmark = 1;
cout << "YES" << endl;
return;
}
else if (step == t || rec[si][sj] == -1){
return;
}
if (ssmark == 1){
return;
}
dfs(si + 1, sj, step + 1);
if (mark != 1){
vis[si+1][sj] = 0;
}
mark = 0;
dfs(si, sj+1, step + 1);
if (mark != 1){
vis[si][sj+1] = 0;
}
mark = 0;
dfs(si - 1, sj, step + 1);
if (mark != 1){
vis[si-1][sj] = 0;
}
mark = 0;
dfs(si, sj - 1, step + 1);
if (mark != 1){
vis[si][sj -1] = 0;
}
mark = 0;
}
int main()
{
// freopen("TestDate.txt", "r", stdin);
int i, j,si,sj,ei,ej;
char node;
while (cin >> n >> m >> t&&(n!=0&&m!=0&&t!=0)){
for (i = 0; i < n; i++)
for (j = 0; j < m; j++){
cin >> node;
if (node == '.'){
rec[i][j] = 1;
continue;
}
else if (node == 'X'){
rec[i][j] = -1;
continue;
}
else if (node == 'S'){
rec[i][j] = -2;
si = i;
sj = j;
continue;
}
else if (node == 'D'){
ei = i;
ej = j;
rec[i][j] = -3;
continue;
}
}
memset(vis, 0, sizeof(vis));
ssmark = 0;
mark = 0;
if ((abs(ei - si) + abs(ej - sj) - t) & 1)
{
printf("NO\n");
continue;
}
dfs(si, sj, 0);
if (ssmark == 0){
cout << "NO" << endl;
}
}
return 0;
}