首页 > 其他分享 >双向广搜-> hdu1195

双向广搜-> hdu1195

时间:2024-01-10 11:00:41浏览次数:33  
标签:状态 int chosen cost hdu1195 双向 rst now


问题描述:密码锁有起始目标两个状态,状态有4个连续数字,数字范围是1~9。其中特殊情况9 + 1 = 0, 1 - 1 = 9。 每次操作可以交换相邻的两个锁上的数字,或者将该位上数字±1。求最小操作次数


分析:是一道双向广搜的题,但是这个题目的第一个思路就是枚举所有的排列组合状态,然后对每个状态求出变成目标状态的最少加减次数以及初始态到该状态的交换次数,直接dfs枚举状态 + 判定即可。


因为没有hdu账号,所以testcase通过了就先默认正确了。


这里初始序列到目标序列交换次数用的是暴力从后往前交换,类似冒泡,好像只有这么一种方法。


void solve(){
    string s, t;
    cin >> s >> t;

    auto getcost = [&](int i, int j)->int{
        int rst = 0;
        if (s[i] <= t[j]){
            rst = min(t[j] - s[i], s[i] + 9 - t[j]);
        }
        else{
            rst = min(s[i] - t[j], t[j] + 9 - s[i]);
        }
        return rst;
    };

    string bg = "0123";
    auto getSwap = [&bg](vector<int>& chosen)->int{
        int rst = 0;
        string now;
        for (auto& x : chosen){
            now += ('0' + x);
        }
        for (int i = 3; i >= 0; --i){
            if (now[i] != bg[i]){
                for (int j = i - 1; j >= 0; --j){
                    if (now[j] == bg[i]){
                        swap(now[i], now[j]);
                        rst ++;
                        break;
                    }
                }
            }
        }
        return rst;
    };
    
    int ans = int(1e9);
    function<void(int, vector<int>&, int)> dfs = [&](int idx, vector<int>& chosen, int cost){
        if (idx == 4 || cost >= ans){
            if (changeMin(ans, cost + getSwap(chosen))){
                //
            }
            return;
        }
        for (int i = 0; i <= 3; ++i){
            bool haschosen = false;
            for (int j = 0; j < idx; ++j){
                if (chosen[j] == i){
                    haschosen = true;
                }
            }
            if (haschosen){
                continue;
            }
            else{
                chosen[idx] = i;
                dfs(idx + 1, chosen, cost + getcost(idx, i));
            }
        }
    };
    
    vector<int> chosen(4, -1);
    dfs(0, chosen, 0);

    cout << ans << '\n';
}

标签:状态,int,chosen,cost,hdu1195,双向,rst,now
From: https://www.cnblogs.com/yxcblogs/p/17956067

相关文章

  • 数据结构线性表之【循环链表、双向链表】
    循环链表在单链表中,每个结点都带有一个指向其后继结点的指针,但因为表尾元素没有后继结点,所以表尾结点的指针域为空,表明它不指向任何结点,并表示这个结点是最后一个结点。现在修改这个约定,将表尾结点的指针指回头结点,从而形成一类新链表。在这样的链表中,从任何一个结点出发并沿着指针......
  • 临沂城建“做媒”,中国女排与沂蒙大地“双向奔赴”
    来源:体育行业网2023年10月7日,杭州亚运会上,中国女排3比0战胜日本女排夺得冠军,第九次站在亚运会最高领奖台。摧枯拉朽般的胜利,值得所有人的掌声和欢呼,这其中来自沂蒙老区人民的呐喊尤为响亮。同年12月25日下午,国家体育总局排球运动管理中心副主任袁磊宣布,2024年排球超级联赛全明星系......
  • 【史上最本质】序列模型:RNN、双向 RNN、LSTM、GRU、Seq-to-Seq、束搜索、Transformer
    序列模型:RNN、双向RNN、LSTM、GRU、Seq-to-Seq、束搜索、Transformer、Bert序列模型是啥RNN结构双向RNN长短期记忆递归神经网络LSTM门控循环单元GRU编码器-解码器Seq-to-SeqBeamSearch束搜索:选择最佳翻译结果TransformerBert 序列模型是啥序列数据是,按照时间顺序或者某......
  • 【史上最小白】Bert 分析类大模型:双向 Transformer 编码器
    Bert:双向Transformer编码器Bert:论洞察语境,GPT不如我深刻;论理解含义,ELMo不如我全面输入阶段词嵌入:把词语转换为向量第一个预训练Masked:学习语言的深层次理解尝试1:预测每个单词尝试2:Masked语言模型尝试3:用随机单词替换部分遮住的单词尝试4:结合遮盖、随机替换和不变的单词......
  • 【C++】STL 容器 - list 双向链表容器 ② ( list 常用 api 简介 | 首尾 添加 / 删除
    文章目录一、元素操作1、首尾添加/删除元素2、获取首尾元素二、迭代器遍历容器1、正向迭代与反向迭代2、代码示例一、元素操作1、首尾添加/删除元素list双向链表容器提供了push_back、pop_back、push_front和pop_front等一系列用于操作列表元素的成员函数,函......
  • 【C++】STL 容器 - list 双向链表容器 ① ( 容器特点 | 容器操作时间复杂度 | 构造函
    文章目录一、list双向链表容器简介1、容器特点2、容器操作时间复杂度3、遍历访问5、头文件二、list双向链表容器构造函数1、默认无参构造函数2、创建包含n个相同元素的list双向链表3、使用初始化列表构造list双向链表4、使用另外一个list容器构造list双向链表容器......
  • 【C++】STL 容器 - list 双向链表容器 ③ ( list 常用 api 简介 | 中间位置 插入 / 删
    文章目录一、list双向链表容器的中间位置插入元素1、在指定位置插入1个元素-insert函数2、在指定位置插入n个相同元素-insert函数3、中间位置插入另一个容器的指定范围内的元素-insert函数二、list双向链表容器的中间位置删除元素1、删除容器中所有元素......
  • 基于CNN和双向gru的心跳分类系统
    CNNandBidirectionalGRU-BasedHeartbeatSoundClassificationArchitectureforElderlyPeople是发布在2023MDPIMathematics上的论文,提出了基于卷积神经网络和双向门控循环单元(CNN+BiGRU)注意力的心跳声分类,论文不仅显示了模型还构建了完整的系统。以前的研究论文总......
  • HDU 1404 ”Solitaire“ (双向广搜)
    HDU1404”Solitaire"OJ:https://acm.hdu.edu.cn/showproblem.php?pid=1401题目大意:8*8的棋盘,上面有四个棋子,棋子可以上下左右移动,如果在上下左右移动的时候该位置有一个棋子已经放置,可以跳过这个棋子放在后面,不可以连续跳过两个。给一个初始状态和一个目标状态。是否可以在......
  • ESP32平台关于RS485分时双向通信的总结
    ESP32平台关于RS485分时双向通信的一些总结介绍ESP32在Arduino环境下收发数据有两个关键函数,一个是Serial.available(),用于检测当前串口的缓存中有无数据,另外一个是Serial.onReceive(onSerialReceive,true);,通过类似于中断的方式,接收数据帧,参数onSerialReceive为接收数据函数,......