hdu 4771 Stealing Harry Potter's Precious

hdu 4771 Stealing Harry Potter's Precious

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

hdu 4771 Stealing Harry Potter's Precious此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“”,获取验证码。在微信里搜索“”或者“”或者微信扫描右侧二维码都可以关注本站微信公众号。

题目:给出一个二维图,以及一个起点,m个中间点,求出从起点出发,到达每一个中间的最小步数。

思路:由于图的大小最大是100*100,所以要使用bfs求出当中每两个点之间的最小距离。然后依据这些步数,建立一个新的图,使用dfs求出最佳步数。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define INF 100000000
using namespace std;
char ma[103][103];
int vis[103][103];
int map[6][6],net[6];
int m,n,k;
struct node
{
    int x,y;
    int k;
}t;
queue<node>q;
int bfs(int x,int y,int l,int r)
{
    memset(vis,0,sizeof(vis));
    while(!q.empty())
    {
        q.pop();
    }
    vis[x][y]=1;
    t.x=x,t.y=y,t.k=0;
    q.push(t);
    while(!q.empty())
    {
        t=q.front();
        q.pop();
        x=t.x;y=t.y;
        if(x==l&&y==r)
        {
            return t.k;
        }
        t.k++;
        if(x>=2&&ma[x-1][y]!='#'&&!vis[x-1][y])
        {
            t.x=x-1;t.y=y;
            vis[t.x][t.y]=1;
            q.push(t);
        }
        if(y>=2&&ma[x][y-1]!='#'&&!vis[x][y-1])
        {
            t.x=x;t.y=y-1;
            vis[t.x][t.y]=1;
            q.push(t);
        }
        if(x+1<=m&&ma[x+1][y]!='#'&&!vis[x+1][y])
        {
            t.x=x+1;t.y=y;
            vis[t.x][t.y]=1;
            q.push(t);
        }
        if(y+1<=n&&ma[x][y+1]!='#'&&!vis[x][y+1])
        {
            t.x=x;t.y=y+1;
            vis[t.x][t.y]=1;
            q.push(t);
        }
    }
    return INF;
}
int ans=INF;
void dfs(int x,int step,int sum)
{
    if(step==k)
    {
        if(ans>sum) ans=sum;
        return;
    }
    for(int i=0;i<=k;i++)
    if(!net[i])
    {
       net[i]=1;
       dfs(i,step+1,sum+map[x][i]);
       net[i]=0;
    }
}
int main()
{
    int d[6][2];
    while(cin>>m>>n,m,n)
    {
        int x=0,y=0,l,r,sum;
        ans=INF;
        for(int i=1;i<=m;i++)
        {
            scanf("%s",&ma[i][1]);
            if(!x)
                for(int j=1;j<=n;j++)
                if(ma[i][j]=='@')
                {
                  x=i,y=j;
                  break;
                }
        }
        d[0][0]=x;d[0][1]=y;
        cin>>k;
        for(int i=1;i<=k;i++)
        {
            cin>>d[i][0]>>d[i][1];
        }
        for(int i=0;i<k;i++)
        {
            x=d[i][0],y=d[i][1];
            for(int j=i+1;j<=k;j++)
            {
                l=d[j][0],r=d[j][1];
                sum=bfs(x,y,l,r);
                if(sum<INF) map[i][j]=map[j][i]=sum;
                else map[i][j]=map[j][i]=INF;
                //cout<<sum<<endl;
            }
        }
        net[0]=1;
        dfs(0,0,0);
        if(ans<INF) cout<<ans<<endl;
        else cout<<-1<<endl;
    }
    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/117918.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • SpringBoot面试题及答案140道(2021年最新)

    SpringBoot面试题及答案140道(2021年最新)工作5年,处于找工作中ing。今年10月份刚刚整理出来的SpringBoot面试题,时间比较赶就没有按照模块分类排序了。总而言之,顺序比较乱,希望大家耐着性子看。如果实在介意,评论告知,我会视情况作修改的。另外如果大家觉得我找的SpringBoot面试题答案不够清晰,欢迎私信或者评论只出,我看到都会去修改的!1、SpringBoot有哪些优点?SpringBoot的优点有:1、减少开发,测试时间和努力。2、使用JavaConfig有助于避免使用XML。3、避免大量的Maven…

  • mobilenet改进_常用的轻量化网络

    mobilenet改进_常用的轻量化网络摘要最近出了一篇旷视科技的孙剑团队出了一篇关于利用ChannelShuffle实现的卷积网络优化——ShuffleNet。我关注了一下,原理相当简单。它只是为了解决分组卷积时,不同featuremaps分组之间的channels信息交互问题,而提出ChannelShuffle操作为不同分组提供channels信息的通信的渠道。然而,当我读到ShuffleNetUnit和Network…

  • 二叉树经典问题——已知中序和前序重建二叉树

    二叉树经典问题——已知中序和前序重建二叉树运用前序和中序序列重建二叉树及其相关应用重建过程1,在二叉树的学习中经常会遇到一类问题,就是给出一棵二叉树的前序和中序序列(后序和中序类似)然后求树的深度、树的后序序列、树的各种遍历等等问题,这个时候如果能根据相关的序列把其代表的二叉树重建出来,那么所有的问题便会迎刃而解。博文的第一部分就给出相关的重建步骤。2,重建中最关键的一点是从前序中找根然后在后序中用相应的根把树‘分解’。举个例子:

  • WebStorm常用快捷键(Mac版)

    WebStorm常用快捷键(Mac版)⌘——Command⌃——Control⌥——alt⇧——Shift⇪——CapsLockfn——功能键就是fn编辑Command+alt+T用(if..else,try..catch,for,etc.)包住Command+/注释/取消注释的行注释Command+alt+/注释/取消注释与块注释alt+↑向上选取代码块alt+↓向下选取代码块Command+alt+L格式化代码tab,shift+tab调整缩进Control+alt+I快

  • java代码大全及详解_Java练级攻略[通俗易懂]

    java代码大全及详解_Java练级攻略[通俗易懂]Java作为一门使用范围巨大的语言,几乎所有的大型互联网或者分布式架构设计都采用Java相关的技术栈,这也是越来越多的人投入到Java的怀抱中,那Java练级应该怎样做起呢?首先给出几点学习建议:一定要有长时间学习,甚至终生学习的态度;一定要动手实操,无论实例多么简单,建议动手操作一遍;一定要学会思考,思考为什么要这样,而不是那样;不要乱买书,基础的知识是经过很长时间积累的;回顾一下技术的发展,你…

  • GBDT算法总结

    GBDT算法总结前向分布算法负梯度拟合在上一节中,我们介绍了GBDT的基本思路,但是没有解决损失函数拟合方法的问题。针对这个问题,大牛Freidman提出了用损失函数的负梯度来拟合本轮损失的近似值,进而拟合一个CART回归树。第t轮的第i个样本的损失函数的负梯度表示为    利用(xi,rti)(i=1…

    2022年10月12日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号