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转换 ...
随机推荐
- OpenStack基础知识-打包知识点
OpenStack是使用setuptools工具来进行打包,不过为了满足OpenStack项目的需求,引入了一个辅助工具pbr来配合setuptools完成打包工作. pbr (Python Buil ...
- 【leetcode 3. 无重复字符的最长子串】解题报告
思路:滑动窗口的思想 方法一:滑动窗口 int lengthOfLongestSubstring(string s) { /* 控制一个滑动窗口,窗口内的字符都是不重复的,通过set可以做到判断字符是 ...
- java笔试面试题准备
J2SE基础 九种基本数据类型的大小,以及它们的封装类 byte 8 Byte char 16 Character short 16 Short int 32 Integer long 64 Long ...
- 对 React Context 的理解以及应用
在React的官方文档中,Context被归类为高级部分(Advanced),属于React的高级API,但官方并不建议在稳定版的App中使用Context. 很多优秀的React组件都通过Conte ...
- Unity应用的iOS热更新
Unity应用的iOS热更新 作者:丁治宇 Unity TechnologiesChina Agenda • 什么是热更新 • 为何要热更新 • 如何在iOS 上对Unity 应用进行热更新 • ...
- Mysql-5-数据表的基本操作
1.创建表:之前需要use database database_name 然后create table 表名(): 例:创建员工表tb_employee1,结构如下表所示 字段名称 数据类型 备注 i ...
- Flask&&人工智能AI --3
一.flask中的CBV 对比django中的CBV,我们来看一下flask中的CBV怎么实现? from flask import Flask, render_template, url_for, ...
- TcxGrid Column动态添加Image
MyCol := TcxColumn.Create; ... MyCol.PropertiesClass := TcxImageProperties; ImageProps := TcxImagePr ...
- upper_bound和lower_bound的用法
首先介绍这两种函数是什么意思 upper_bound是找到大于t的最小地址,如果没有就指向末尾 lower_bound是找到大于等于t的最小地址 题目链接:https://vjudge.net/con ...
- 为什么有人会觉得IT门槛低,工资高?
今天在高铁上,翻着逼乎,被一个话题勾住了,"为什么很多人会觉得IT门槛低?" 我一惊,还真是,身边朋友都觉得"IT赚的多","程序员工资高" ...