题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1010
题意:判断从S能否在第T秒到达D点,能输出YES,不能输出NO。
我首先拿到这道题目的时候,最先想到的是A*算法,可是WA了,大家要注意,题目说的是在第T秒到达D点,所以不能用A*算法
再看数据范围,最大7*7,直接爆搜,果断超时了,只能剪枝:
1、可走点<=,输出NO。
2、T小于S到D的最小步数,输出NO。
3、注意奇偶性,T的奇偶性要和最小步数的奇偶性相同,这个自己想想就知道了。
4、用flag标记,每当调用时判断是否已经有路可行,如果有,果断return。
代码如下:有详细注释
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <queue>
using namespace std;
/*
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
*/
char xh[8][8];
bool visit[8][8];
int n,m,t,sx,sy,dx,dy,flag;
int tt[4][2]={-1,0,1,0,0,-1,0,1};
void dfs(int x,int y,int k)
{
int xx,yy;
if(flag)//如果已经有符合的,直接return,剪枝
return ;
if(k==t)
{
if(xh[x][y]=='D')//k等于t时,如果在D处,flag置为1
flag=1;
return ;//不管是否在D处,当k等于t时,都要返回,剪枝
}
for(int i=0;i<4;i++)
{
xx=x+tt[i][0];
yy=y+tt[i][1];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&!visit[xx][yy]&&xh[xx][yy]!='X')
{
visit[xx][yy]=true;
dfs(xx,yy,k+1);
visit[xx][yy]=false;
}
}
}
int main()
{
int i,j;
while(cin>>n>>m>>t&&n+m+t)
{
int sum=0;//记录多少个可走路径
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
cin>>xh[i][j];
if(xh[i][j]=='S')
{
sx=i;sy=j;
}
if(xh[i][j]=='D')
{
dx=i;dy=j;
}
if(xh[i][j]!='X')
sum++;
}
int bu=abs(sx-dx)+abs(sy-dy);//最小步数
if(sum<=t||bu>t||bu%2!=t%2)//可走点<=t、t小于最小步数、不同奇同偶输出NO
{
printf("NO\n");
continue;
}
flag=0;//初始化为0
memset(visit,false,sizeof(visit));
visit[sx][sy]=true;
dfs(sx,sy,0);
if(flag==0)
printf("NO\n");
else
printf("YES\n");
}
return 520;
}