题目链接 : HDU1010 - Tempter of the Bone
思路
在最基本的走迷宫上加了一个固定步数的限制。在原先的代码中并不需要太多的改变,将成功退出条件更改一下。
将这个表格,从上到下,从左到右填入数字 1,2,3……。观察就会发现,奇到奇,偶倒偶都需要偶数步,否则需要奇数步,这样的话就可以在搜索前加上一个判断。如果不符合这个条件的话,就是完全不可能的。
这样进行剪枝后,还是很慢……
代码
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int maze[10][10];
int n, m, t;
// 起始点 终止点
int ex, ey, bx, by;
// 增量
int xx[] = {0, 1, 0, -1};
int yy[] = {1, 0, -1, 0};
char str[10];
bool dfs(int x, int y, int k)
{
// 越界
if(x>n||x<1||y>m||y<1) return false;
if(k==t)
{
// 成功
if(x==ex&&y==ey) return true;
else return false;
}
for(int i=0; i<4; i++)
{
// 可达点满足条件
if(maze[x+xx[i]][y+yy[i]]==0)
{
maze[x+xx[i]][y+yy[i]] = 1;
// 访问
if(dfs(x+xx[i], y+yy[i], k+1))
return true;
// 访问结束,置为 0
maze[x+xx[i]][y+yy[i]] = 0;
}
}
return false;
}
int main()
{
while(scanf("%d%d%d", &n, &m, &t)&&n)
{
for(int i=1; i<=n; i++)
{
scanf("%s", str+1);
for(int j=1; j<=m; j++)
{
if(str[j]=='.') maze[i][j] = 0;
else if(str[j]=='S') maze[i][j] = 1, bx = i, by = j;
else if(str[j]=='X') maze[i][j] = 1;
else maze[i][j] = 0, ex = i, ey = j;
}
}
// 可走步数小于最近距离,不过加上也没有什么用
if((abs(ex-bx)+abs(ey-by))>t)
{
printf("NO\n");
continue;
}
// 同奇或同偶
if(((bx+by)&1)==((ex+ey)&1))
{
if(t&1)
{
printf("NO\n");
continue;
}
}
else if(!(t&1))
{
printf("NO\n");
continue;
}
if(dfs(bx, by, 0)) printf("YES\n");
else printf("NO\n");
}
return 0;
}