ACM-HDU-1010 WA and TLE
思路:这道题很多小伙伴拿着就去BFS了,但是它并不是求最短路径,用DFS的小伙伴也有TLE的还有WA的(例如我),想懂了之后其实就是DFS+奇偶剪枝(代码上注释了的)+在时间范围内判断能否到达终点,如果在规定时间恰到终点就一直退出递归(用标记量),而WA的小伙伴就是测试数据的问题,查了很久,发现很多人都说有空格的问题,果断换成cin就没事儿了.
需要知识:在一个矩阵中每次走一步,那么minlength=abs(startx-endx)+abs(starty-endy)
奇偶剪枝:从起点到终点的其他路径的长度-minlength一定是偶数的倍数(0,2,4…)
时间范围内判断能否到达终点: T-now_time-now_minlength<0即不能到达
代码:
#include <bits/stdc++.h>
using namespace std;
char tim[7][7];
//aim起点,end终点,flag标记量
int n,m,T,aimx,aimy,endx,endy,flag;
//移动方案
int p[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
void DFS(int x ,int y,int time){
//让当前位置不可选
tim[x][y]='X';
int xx,yy;
if(x==endx&&y==endy)
{
if(time==T)
flag=1;
return ;
}
//奇偶剪枝与时间范围内能否到达
if(T<time+abs(x-endx)+abs(y-endy)||(T-time-abs(x-endx)-abs(y-endy))%2!=0)
return ;
for(int i=0;i<4;i++){
xx=p[i][0]+x;
yy=p[i][1]+y;
if(xx<n&&xx>=0&&yy<m&&yy>=0&&tim[xx][yy]!='X'){
DFS(xx,yy,time+1);
//提前退出递归
if(flag)
return ;
//回溯
tim[xx][yy]='.';
}
}
}
int main()
{
int i,j;
scanf("%d%d%d",&n,&m,&T);
while(n!=0&&m!=0&&T!=0){
for(i=0;i<n;i++){
for(j=0;j<m;j++){
cin >> tim[i][j];
if(tim[i][j]=='S')
{
aimx=i;
aimy=j;
}
if(tim[i][j]=='D')
{
endx=i;
endy=j;
}
}
}
flag=0;
DFS(aimx,aimy,0);
if(flag)
printf("YES\n");
else
printf("NO\n");
scanf("%d%d%d",&n,&m,&T);
}
return 0;
}
如果对你有帮助的小伙伴,留下你的点赞,我会持续更新HDU题目的 加油