当前位置: 首页 > news >正文

最少交换次数

bfs,折半搜索,因为直接搜大概有(12)^13?因为每个状态都会扩展出m种状态大概是(12)^13,然而可以折半搜索,只搜一半,状态数变成(12)^7可以接受,但是事实上极限数据要跑很长很长时间,据说正解是启发式搜索?没学过

#include<iostream>
#include<map> 
#include<set>
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
string S,tar;
map<string, int> mp;
map<string, int> mp1;
queue<string>q;
queue<string>temp;
int n,m,p;
int a[30],b[30];
ll Hash(string s)
{
    ll ret=0;
    for(int i=1;i<=n;i++) {ret*=171;ret+=a[i];}
    return ret; 
}

bool bfs()
{
    q.push(S);
    mp[S]=0;
    while(!q.empty())
    {
        string s = q.front();
        int step = mp[s];
        q.pop();
        for(int i=1;i<=m;i++)
        {
            swap(s[a[i]],s[b[i]]);
            if(!mp.count(s)) {
                if(s==tar) {printf("%d\n",step+1);return false;}
                temp.push(s);mp[s] = step + 1;
            }
            swap(s[a[i]],s[b[i]]);
        }
    }
    return true;
}

void bfs1()
{
    q.push(tar); 
    mp1[tar] = 0;
    while(!q.empty())
    {
        string s=q.front();q.pop();int step=mp1[s];
        for(int i=1;i<=m;i++)
        {
            swap(s[a[i]],s[b[i]]);
            if(mp.count(s)) 
            {
                printf("%d\n",mp[s]+step+1);
                return;
            }
            if(!mp1.count(s)) 
            {    
                q.push(s);
                mp1[s]=step+1;
            }
            swap(s[a[i]],s[b[i]]);
        }
    }
}
int main()
{
    
    cin>>n>>m;
    for(int i=1;i<=n;i++) 
    {
        cin>>p;
        S+=(char)(p+'a');
        tar+=(char)(i+'a');
    }
//    cout<<S<<'\n'<<tar<<'\n';
    for(int i=1;i<=m;i++) cin>>a[i]>>b[i],a[i]--,b[i]--;    
    if(S==tar) {printf("0\n");return 0;}
    if(bfs()) bfs1(); 
    return 0;
}

 

转载于:https://www.cnblogs.com/19992147orz/p/6034474.html

相关文章:

  • 团队作业三之问题解答
  • srand()、rand()、time()函数的用法
  • 更改pip源至国内镜像,显著提升下载速度(转载)
  • 如何用distinct消除重复记录的同时又能选取多个字段值?
  • JavaScript之继承(原型链)
  • 21、JavaScript加强
  • linux uart驱动——相关数据结构以及API(二)
  • 放课后的约定
  • Matlab Tricks(二十)—— Hilbert matrix 的创建
  • php面向对象
  • require.js与sea.js的区别
  • 11-13
  • Discuz! 6.x/7.x 全局变量防御绕过导致命令执行
  • 各类应用的简称
  • java的反射
  • ES6指北【2】—— 箭头函数
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • canvas 绘制双线技巧
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Fastjson的基本使用方法大全
  • nginx 配置多 域名 + 多 https
  • oschina
  • Python 基础起步 (十) 什么叫函数?
  • uva 10370 Above Average
  • yii2权限控制rbac之rule详细讲解
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 使用 Docker 部署 Spring Boot项目
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 硬币翻转问题,区间操作
  • Java性能优化之JVM GC(垃圾回收机制)
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​马来语翻译中文去哪比较好?
  • (1)SpringCloud 整合Python
  • (九十四)函数和二维数组
  • (论文阅读40-45)图像描述1
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)程序员技术练级攻略
  • ./configure,make,make install的作用(转)
  • .dwp和.webpart的区别
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Core引入性能分析引导优化
  • .NET 材料检测系统崩溃分析
  • .NET微信公众号开发-2.0创建自定义菜单
  • .net知识和学习方法系列(二十一)CLR-枚举
  • .so文件(linux系统)
  • /dev/sda2 is mounted; will not make a filesystem here!
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @EventListener注解使用说明
  • [ Algorithm ] N次方算法 N Square 动态规划解决
  • [2010-8-30]
  • [ai笔记3] ai春晚观后感-谈谈ai与艺术
  • [Android]创建TabBar