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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ACM-ICPC(国际大学生程序设计竞赛)是一项面向大学生的计算机编程竞赛,涉及算法和数据结构等领域。在比赛中,选手需要解决一系列编程问题,使用合适的算法和数据结构来实现正确和高效的解决方案。 对于整理ACM-ICPC模板,以下是一些建议: 1. 了解比赛要求:首先,你需要了解ACM-ICPC比赛的具体要求和规则。这包括了解比赛所涉及的算法和数据结构,以及题目的类型和难度等。 2. 收集资料:收集与ACM-ICPC相关的资料,包括经典算法和数据结构的实现代码、常见问题的解题思路等。可以参考教材、博客、论文等资源。 3. 整理模板:将收集到的资料整理成模板。可以按照算法和数据结构的分类进行整理,例如排序算法、图算法、字符串算法等。对每个模板,添加必要的注释和示例代码,以便理解和使用。 4. 测试代码:对每个模板编写测试代码,确保它们的正确性和可靠性。可以使用已知的测试用例或自行设计测试用例。 5. 更新与扩充:定期更新和扩充模板,以适应ACM-ICPC比赛中新出现的算法和数据结构。同时,根据自己的经验和理解,对模板进行优化和改进。 6. 练习和复习:在比赛之前,利用整理好的模板进行练习和复习。尝试解决一些经典问题,使用模板中的算法和数据结构进行实现,并进行优化。 希望这些建议对你整理ACM-ICPC模板有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值