康托展开:

康托展开表示的是当前n个元素排列在n个不同元素的全排列中的名次。

比如213在这3个数所有排列中排第3。

那么,对于n个数的排列,康托展开为:

ans=an*(n-1)!+an-1*(n-2)!+…+ai*(i-1)!+…+a2*1!+a1*0!

其中:a从右向左排号 2是a3, 1是a2, 3是a1

a表示每一个数的右边比它小的数的个数

2: 13 1<2 a3=1

1: 3 a2=0

3: a1=0


#include <map>
#include <set>
#include <queue>
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
struct Matrix{int m[4][4], step;
}sta;int dx[3]={0,1}, dy[3]={1,0};
int f[10]={0,40320,5040,720,120,24,6,2,1};
int vis[500005];
set<int> ans;int Contor( Matrix s ){int ans=0;for ( int i=1; i<=9; i++ ){int tmp=0;for ( int j=i+1; j<=9; j++ )if( s.m[((i-1)/3)+1][((i-1)%3)+1] > s.m[((j-1)/3)+1][((j-1)%3)+1] ) tmp++;ans+=tmp*f[i]; }return ans;
}void bfs(){queue<Matrix> Q;memset(vis,0,sizeof(vis));vis[Contor(sta)]=1;sta.step=0;Q.push(sta);while( !Q.empty() ){Matrix u=Q.front();Q.pop();if( ans.count(Contor(u)) ){printf("%d\n", u.step );return ;}for ( int i=1; i<=3; i++ ){for ( int j=1; j<=3; j++ ){for ( int k=0; k<=1; k++ ){int i0=i+dx[k];int j0=j+dy[k];if( i0<=3 && j0<=3 ){Matrix u1=u;swap( u1.m[i][j], u1.m[i0][j0] );int ct=Contor(u1);u1.step++;if( vis[ct] ) continue;vis[ct]=1;Q.push(u1);}}}}}puts("-1");
}
int main(){ans.clear();ans.insert(69074); ans.insert(77576); ans.insert(135289); ans.insert(157120);ans.insert(205759); ans.insert(227590); ans.insert(285303); ans.insert(293805);while( scanf("%d%d%d", &sta.m[1][1], &sta.m[1][2], &sta.m[1][3])==3 ){for ( int i=2; i<=3; i++ )for ( int j=1; j<=3; j++ )scanf("%d", &sta.m[i][j] );bfs();}return 0;
}

Vijos1029[晴天小猪历险记之Number] 搜索+康托展开相关推荐

  1. 【题解】vijos P1029 晴天小猪历险记之number(bfs 康托展开)

    显然这道题可以用bfs解决.我们可以首先得到8种横竖斜之和均为15的情况,然后给它们赋予一个值,从这八种情况扩展,开一个dis数组记录某种情况所需要的步数,然后扩展出哪种就给哪种步数+1就行了.但关键 ...

  2. VIjos 晴天小猪历险记之Number (搜索+链表hash)

    背景 话说上一回,晴天小猪不畏千难万险.千辛万苦.千磨万难--终于爬上了那座深山,来到了那位隐者的小屋中,但它不知道,有一个问题正等待着它-- 晴天小猪一推开门,就发现那里--空无一人?但在屋中央有一 ...

  3. 洛谷P1088.火星人【模拟/搜索/康托展开】

    洛谷P1088.火星人[模拟/搜索/康托展开] 题干 题目描述 输入格式 输出格式 输入输出样例 说明/提示 题意 思路一--模拟 分析 上代码 思路二--搜索 分析 上代码 思路三--变进制数与康托 ...

  4. Vijos 1029 晴天小猪历险记之Number【BFS+康托展开】

    Vijos 1029 背景 话说上一回,晴天小猪不畏千难万险.千辛万苦.千磨万难--终于爬上了那座深山,来到了那位隐者的小屋中,但它不知道,有一个问题正等待着它-- 晴天小猪一推开门,就发现那里--空 ...

  5. hihoCoder 1312:搜索三·启发式搜索(A* + 康托展开)

    题目链接 题意 中文题意 思路 做这题的前置技能学习 康托展开 这个东西我认为就是在排列组合问题上的Hash算法,可以压缩空间. A*搜索. 这里我使用了像k短路一样的做法,从最终状态倒回去预处理一遍 ...

  6. 【BZOJ】3301: [USACO2011 Feb] Cow Line(康托展开)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3301 其实这一题很早就a过了,但是那时候看题解写完也是似懂非懂的.... 听zyf神犇说是康托展开, ...

  7. HDU 1043 Eight(双向BFS+康托展开)

    http://acm.hdu.edu.cn/showproblem.php?pid=1043 题意:给出一个八数码,求出到达指定状态的路径. 思路:路径寻找问题.在这道题里用到的知识点挺多的.第一次用 ...

  8. java实现排程算法_康托展开算法和逆康托展开算法[Java实现]

    基于这篇介绍我实现了基于Java的算法 都能看懂的康托展开_ltrbless的博客-CSDN博客​blog.csdn.net 条件 一个数组:[1, 2, 3, 4, 5] 康托展开算法 找出 524 ...

  9. [总结] 康托展开及其逆运算

    这里先贴一道例题 我们先科普一下康托展开 定义: X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0! ai为整数,并且0<=ai<i ...

最新文章

  1. windows命令行设置环境变量
  2. 微软为什么要“杀死”小娜?
  3. sql server规范
  4. 前端多行文本溢出问题解决方案
  5. java流程控制both_java web面试题
  6. 【工具推荐】PDF和其他格式的相关的转换
  7. Rust:阴阳谜题输出
  8. 这10个idea小技巧,让我的开发效率提升了10倍
  9. 百度地图,根据地址计算经度纬度
  10. 信使广告终结者 绿色
  11. python 列举图像颜色
  12. 大学如何自学计算机科学与技术?
  13. 现代材料分析方法习题汇总及答案
  14. 解决上传 Gitee 后图片显示不出来
  15. uni.navigateTo页面跳转时传对象参数
  16. re匹配中文格式的字符
  17. 软件测试与治学的三重境界
  18. Html主要内容总结
  19. python 抓取lol主播排行
  20. 《Python语言程序设计》王恺 王志 机械工业出版社 第八章 多线程与多进程 课后习题答案

热门文章

  1. 克劳德·香农(Claude Elwood Shannon,1916-2001
  2. jpg、png、gif、webp详细介绍
  3. openresty 动态黑白名单
  4. react 单元测试 (jest+enzyme)
  5. Pulsar简单实现demo
  6. word2vec_gensim 中文处理 小试牛刀
  7. Matlab中产生正态分布随机数的函数normrnd
  8. 《缠中说禅108课》55:买之前戏,卖之高潮
  9. 如何解决医美行业获客难得问题,我是一名医美行业的营销人员
  10. 计算机网络(3)——速率相关的性能指标