题目地址: 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; }