ACM-HDU-1010 WA and TLE

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题目的 加油

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值