HOJ 2064 Journey to Tibet (DFS)

本文探讨了一道编程难题的解决过程,从最初使用BFS导致超时,到意识到理解错误并成功转换为DFS算法。分享了解题过程中遇到的挑战、思考过程以及最终通过AC的经验。适合对算法优化和逻辑思考感兴趣的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目中要求只要两个村庄间的距离小于等于30就可以转移。而刚开始我以为这个人最多只能走30,转移的路超过30之后就不能再转移了。刚开始用的BFS,怎么写都超时。后来发现看错题了之后,果断换成了DFS,然后才AC。本来挺简单的一道,浪费了大半天的时间。。不过最后能过掉还是很开心的。。

#include <iostream>
#include <cstdio>
#include <stack>
#include <memory.h>
using namespace std;

struct Village
{
    int  x;
    int y;
    int monas;

};
bool visited [1005];
int calDistance(Village a,Village b);

int main()
{
    int num;
    Village vill[1001];

    while(cin>>num && num)
    {

        int imax=0;
        int res=0;
        for(int i=0; i<num; i++)
        {
            scanf("%d %d %d",&vill[i].x,&vill[i].y,&vill[i].monas);
        }
        stack <Village> S;
        Village tmp;

        for(int i=0; i<num; i++)
        {
            memset(visited,0,sizeof(visited));
            visited[i]=1;

            S.push(vill[i]);
            int ans[1001]= {0};
            ans[i]+=vill[i].monas;
            while(!S.empty())
            {
                tmp=S.top();
                bool flag=0;
                for(int j=0; j<num; j++)
                {
                    if(calDistance(vill[j],tmp)<=900&&visited[j]==0)
                    {
                        visited[j]=1;
                        S.push(vill[j]);
                        ans[i]+=vill[j].monas;
                        flag=1;
                    }
                }
                if(!flag)S.pop();

            }
            if(res<ans[i])
            {
                res=ans[i];
                imax=i;
            }
        }
        printf("%d %d\n",imax+1,res);

    }
}

int calDistance(Village a,Village b)
{
    return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值