Aizu 0121 Seven Puzzle(变进制数的完美hash)
一遍预处理跑完所有情况,O(1)回答就好。状态记录我用的康拓和逆康拓。
#include<bits/stdc++.h>
using namespace std; int d[];
int fac[];
int u[]; int cantor()
{
int re = ;
for(int i = ; i < ; i++){
int inv = ;
for(int j = i; ++j < ; ){
if(u[i]>u[j]) inv++;
}
re += fac[-i]*inv;
}
return re;
} void invCantor(int x)
{
bool vis[] = {};
for(int i = ; i < ; i++){
int w = x/fac[-i];
x %= fac[-i];
int j = ;
for( ; j < ; j++){
if(!vis[j]){
if(!w) break;
w--;
}
}
u[i] = j; vis[j] = true;
}
} int cur;
queue<int> q; inline void updata(int p0,int p1)
{
swap(u[p0],u[p1]);
int s = cantor();
if(!d[s]){
d[s] = d[cur]+;
q.push(s);
}
swap(u[p0],u[p1]);
} void bfs()
{
d[] = ;
q.push();
while(q.size()){
invCantor(cur = q.front()); q.pop();
int p;
for(int i = ; i < ; i++)
if(!u[i]){ p = i; break; }
int r = p%;
if(r) {
updata(p-,p);
}
if(r<){
updata(p+,p);
}
updata(p,p+(p>?-:));
}
} void preDeal()
{
fac[] = ;
for(int i = ; i < ; i++){
fac[i] = fac[i-]*i;
}
bfs();
} int read()
{
if(scanf("%d",u)<) return -;
for(int i = ; i < ; i++) scanf("%d",u+i);
return cantor();
} //#define LOCAL
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif
preDeal();
int s;
while( ~(s = read()) ){
printf("%d\n",d[s]-);
}
return ;
}
Aizu 0121 Seven Puzzle(变进制数的完美hash)的更多相关文章
- 『数 变进制状压dp』
数 Description 给定正整数n,m,问有多少个正整数满足: (1) 不含前导0: (2) 是m的倍数: (3) 可以通过重排列各个数位得到n. \(n\leq10^{20},m\leq100 ...
- 关于不同进制数之间转换的数学推导【Written By KillerLegend】
关于不同进制数之间转换的数学推导 涉及范围:正整数范围内二进制(Binary),八进制(Octonary),十进制(Decimal),十六进制(hexadecimal)之间的转换 数的进制有多种,比如 ...
- [转]as3 算法实例【输出1 到最大的N 位数 题目:输入数字n,按顺序输出从1 最大的n 位10 进制数。比如输入3,则输出1、2、3 一直到最大的3 位数即999。】
思路:如果我们在数字前面补0的话,就会发现n位所有10进制数其实就是n个从0到9的全排列.也就是说,我们把数字的每一位都从0到9排列一遍,就得到了所有的10进制数. /** *ch 存放数字 *n n ...
- 1813. M进制数问题
1813. M进制数问题 Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description 试用 C++的类来表示一般进制数. 给定 2 ...
- CF459C Pashmak and Buses (构造d位k进制数
C - Pashmak and Buses Codeforces Round #261 (Div. 2) C. Pashmak and Buses time limit per test 1 seco ...
- [codevs1157]2^k进制数
[codevs1157]2k进制数 试题描述 设r是个2k 进制数,并满足以下条件: (1)r至少是个2位的2k 进制数. (2)作为2k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. ...
- noip2006 2^k进制数
设r是个2k进制数,并满足以下条件: (1)r至少是个2位的2k进制数. (2)作为2k进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. (3)将r转换为2进制数q后,则q的总位数不超过w ...
- c++描述将一个2进制数转化成10进制数(用到初始化栈,进栈,入栈)
/* c++描述将2进制数转化成10进制数 问题,1.初始化栈后,用new,不知道delete是否要再写一个函数释放内存, 还是在哪里可以加上delete 2.如果栈满了,我要分配多点空间,我想的办法 ...
- NOIP2006 2k进制数
2^k进制数 题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. (3)将r转换 ...
随机推荐
- 【leetcode 105. 从前序与中序遍历序列构造二叉树】解题报告
前往 中序,后序遍历构造二叉树, 中序,前序遍历构造二叉树 TreeNode* build(vector<int>& preorder, int l1, int r1, vecto ...
- poj 1741 Tree(树的点分治)
poj 1741 Tree(树的点分治) 给出一个n个结点的树和一个整数k,问有多少个距离不超过k的点对. 首先对于一个树中的点对,要么经过根结点,要么不经过.所以我们可以把经过根节点的符合点对统计出 ...
- bzoj2724: [Violet 6]蒲公英(分块)
传送门 md调了一个晚上最后发现竟然是空间开小了……明明算出来够的…… 讲真其实我以前不太瞧得起分块,觉得这种基于暴力的数据结构一点美感都没有.然而今天做了这道分块的题才发现分块的暴力之美(如果我空间 ...
- Tomcat热部署的实现原理
Tomcat热部署机制 对于Java应用程序来说,热部署就是在运行时更新Java类文件.在基于Java的应用服务器实现热部署的过程中,类装入器扮演着重要的角色.大多数基于Java的应用服务器,包括EJ ...
- vue 中的.sync语法糖
提到父子组件相互通信,可能大家的第一反应是$emit,最近在学着封装组件,以前都是用的别人封装好的UI组件,对vue中的.sync这个修饰符有很大的忽略,后来发现这个修饰符很nice,官方对她的描述是 ...
- Java基础笔记(十五)——封装(续)static关键字
static 静态的,用static修饰的成员叫静态成员或类成员.类实例化的所有对象都会共用同一块静态空间.一个对象将值改变,其它对象的值也就随之改变了. 如:public static int pr ...
- promise封装小程序的蓝牙类
// pages/bluetooth/bluetooth.js import { BluetoothMode } from '../../models/bluetooth.js' import {Sy ...
- 点击对应的a标签返回相应的第几个
面试中遇到的问题,前两天一直没有解决,今天想想还是得要想办法才行,其实仔细想的话很简单,惭愧啊,面试的时候没有做出来! 题目是这样的,如果一个body中有5个a标签,当我们点击对应的a标签时,aler ...
- crawlspider的源码学习
Spider基本上能做很多事情了,但是如果你想爬取全站的话,可能需要一个更强大的武器.CrawlSpider基于Spider,但是可以说是为全站爬取而生.CrawlSpiders是Spider的派生类 ...
- Luogu P3265 [JLOI2015]装备购买
好吧刚开始不知道自己在写什么,,,后来写了线性方程组,又过了一天一上午终于明白了... 当然题意很显然:求代价最小的极大线性无关组. 那就高斯消元(好吧刚开始我不会用它来解这道题qwq) 第一个循环是 ...