Vijos1029[晴天小猪历险记之Number] 搜索+康托展开
康托展开:
康托展开表示的是当前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] 搜索+康托展开相关推荐
- 【题解】vijos P1029 晴天小猪历险记之number(bfs 康托展开)
显然这道题可以用bfs解决.我们可以首先得到8种横竖斜之和均为15的情况,然后给它们赋予一个值,从这八种情况扩展,开一个dis数组记录某种情况所需要的步数,然后扩展出哪种就给哪种步数+1就行了.但关键 ...
- VIjos 晴天小猪历险记之Number (搜索+链表hash)
背景 话说上一回,晴天小猪不畏千难万险.千辛万苦.千磨万难--终于爬上了那座深山,来到了那位隐者的小屋中,但它不知道,有一个问题正等待着它-- 晴天小猪一推开门,就发现那里--空无一人?但在屋中央有一 ...
- 洛谷P1088.火星人【模拟/搜索/康托展开】
洛谷P1088.火星人[模拟/搜索/康托展开] 题干 题目描述 输入格式 输出格式 输入输出样例 说明/提示 题意 思路一--模拟 分析 上代码 思路二--搜索 分析 上代码 思路三--变进制数与康托 ...
- Vijos 1029 晴天小猪历险记之Number【BFS+康托展开】
Vijos 1029 背景 话说上一回,晴天小猪不畏千难万险.千辛万苦.千磨万难--终于爬上了那座深山,来到了那位隐者的小屋中,但它不知道,有一个问题正等待着它-- 晴天小猪一推开门,就发现那里--空 ...
- hihoCoder 1312:搜索三·启发式搜索(A* + 康托展开)
题目链接 题意 中文题意 思路 做这题的前置技能学习 康托展开 这个东西我认为就是在排列组合问题上的Hash算法,可以压缩空间. A*搜索. 这里我使用了像k短路一样的做法,从最终状态倒回去预处理一遍 ...
- 【BZOJ】3301: [USACO2011 Feb] Cow Line(康托展开)
http://www.lydsy.com/JudgeOnline/problem.php?id=3301 其实这一题很早就a过了,但是那时候看题解写完也是似懂非懂的.... 听zyf神犇说是康托展开, ...
- HDU 1043 Eight(双向BFS+康托展开)
http://acm.hdu.edu.cn/showproblem.php?pid=1043 题意:给出一个八数码,求出到达指定状态的路径. 思路:路径寻找问题.在这道题里用到的知识点挺多的.第一次用 ...
- java实现排程算法_康托展开算法和逆康托展开算法[Java实现]
基于这篇介绍我实现了基于Java的算法 都能看懂的康托展开_ltrbless的博客-CSDN博客blog.csdn.net 条件 一个数组:[1, 2, 3, 4, 5] 康托展开算法 找出 524 ...
- [总结] 康托展开及其逆运算
这里先贴一道例题 我们先科普一下康托展开 定义: X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0! ai为整数,并且0<=ai<i ...
最新文章
- windows命令行设置环境变量
- 微软为什么要“杀死”小娜?
- sql server规范
- 前端多行文本溢出问题解决方案
- java流程控制both_java web面试题
- 【工具推荐】PDF和其他格式的相关的转换
- Rust:阴阳谜题输出
- 这10个idea小技巧,让我的开发效率提升了10倍
- 百度地图,根据地址计算经度纬度
- 信使广告终结者 绿色
- python 列举图像颜色
- 大学如何自学计算机科学与技术?
- 现代材料分析方法习题汇总及答案
- 解决上传 Gitee 后图片显示不出来
- uni.navigateTo页面跳转时传对象参数
- re匹配中文格式的字符
- 软件测试与治学的三重境界
- Html主要内容总结
- python 抓取lol主播排行
- 《Python语言程序设计》王恺 王志 机械工业出版社 第八章 多线程与多进程 课后习题答案