hdu 5012 bfs 康托展开
Dice
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 491 Accepted Submission(s): 290
At the beginning, the two dices may face different(which means there exist some i, ai ≠ bi). Ddy wants to make the two dices look the same from all directions(which means for all i, ai = bi) only by the following four rotation operations.(Please read the picture for more information)
Now Ddy wants to calculate the minimal steps that he has to take to achieve his goal.For each case, the first line consists of six integers a1,a2,a3,a4,a5,a6, representing the numbers on dice A.
The second line consists of six integers b1,b2,b3,b4,b5,b6, representing the numbers on dice B.
1 2 3 4 5 6
1 2 3 4 5 6
1 2 5 6 4 3
1 2 3 4 5 6
1 4 2 5 3 6
3
-1
卜神的代码
为了测试康托展开, 文中注释部分是卜神原来的代码,也是ac的。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std; typedef long long ll; const int CANTO = ;
const int LEN = ; int fac[];
bool vis[CANTO];
int begin, end;
struct Sit
{
int arr[LEN];
int step;
}; void makefac()
{
fac[] = fac[] = ;
for(int i = ; i <= ; i++)
fac[i] = i * fac[i-];
} int canto(int arr[])
{
int res = ;
for(int i = ; i < LEN; i++){
int num=;
for(int j=i+;j<LEN;j++)
if(arr[j]<arr[i]) num++;
res+=(num*fac[LEN-i-]);
}
// res += fac[i+2] * arr[i];
return res;
} int bfs(Sit src)
{
queue <Sit> q;
Sit now, tmp;
int t, c;
vis[begin] = true;
q.push(src);
while(!q.empty())
{
now = q.front();
q.pop();
tmp = now, tmp.step++; t = tmp.arr[];
tmp.arr[] = tmp.arr[];
tmp.arr[] = tmp.arr[];
tmp.arr[] = tmp.arr[];
tmp.arr[] = t;
c = canto(tmp.arr);
if (c == end){
return tmp.step;
}
if (!vis[c]){
vis[c] = true;
q.push(tmp);
}
tmp = now, tmp.step++; t = tmp.arr[];
tmp.arr[] = tmp.arr[];
tmp.arr[] = tmp.arr[];
tmp.arr[] = tmp.arr[];
tmp.arr[] = t;
c = canto(tmp.arr);
if (c == end){
return tmp.step;
}
if (!vis[c]){
vis[c] = true;
q.push(tmp);
} tmp = now, tmp.step++; t = tmp.arr[];
tmp.arr[] = tmp.arr[];
tmp.arr[] = tmp.arr[];
tmp.arr[] = tmp.arr[];
tmp.arr[] = t;
c = canto(tmp.arr);
if (c == end){
return tmp.step;
}
if (!vis[c]){
vis[c] = true;
q.push(tmp);
} tmp = now, tmp.step++; t = tmp.arr[];
tmp.arr[] = tmp.arr[];
tmp.arr[] = tmp.arr[];
tmp.arr[] = tmp.arr[];
tmp.arr[] = t;
c = canto(tmp.arr);
if (c == end){
return tmp.step;
}
if (!vis[c]){
vis[c] = true;
q.push(tmp);
}
}
return -;
} int main()
{
makefac();
int src[LEN];
int dst[LEN];
while(~scanf("%d", src)){
memset(vis, , sizeof(vis));
for(int i = ; i < LEN; i++)
scanf("%d", src+i);
for(int i = ; i < LEN; i++)
scanf("%d", dst+i);
begin = canto(src);
end = canto(dst);
if (begin == end){
printf("0\n");
continue;
}
Sit x;
memcpy(x.arr, src, LEN*sizeof(int));
x.step = ;
printf("%d\n", bfs(x));
}
return ;
}
经过以下代码验证,网上的代码,康托展开是连续值,卜神的只是起到了展开作用,不过代码更加简洁。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std; typedef long long ll; const int CANTO = ;
const int LEN = ; int fac[];
int a[LEN]; void makefac()
{
fac[] = fac[] = ;
for(int i = ; i <= ; i++)
fac[i] = i * fac[i-];
} int canto(int arr[])
{
int res = ;
for(int i = ; i < LEN; i++){
int num=;
for(int j=i+;j<LEN;j++)
if(arr[j]<arr[i]) num++;
res+=(num*fac[LEN-i-]);
}
// res += fac[i+2] * arr[i];
return res;
} int canto2(int arr[])
{
int res = ;
for(int i = ; i < LEN; i++){
// int num=0;
// for(int j=i+1;j<LEN;j++)
// if(arr[j]<arr[i]) num++;
// res+=(num*fac[LEN-i-1]);
res += fac[i+] * arr[i];
}
// res += fac[i+2] * arr[i];
return res;
} int main()
{
freopen("data.out","w",stdout);
makefac();
a[]=;a[]=;a[]=;a[]=;a[]=;a[]=;
printf("a=%d %d %d %d %d %d ",a[],a[],a[],a[],a[],a[]);
printf("can=%d %d\n",canto(a),canto2(a));
while(next_permutation(a+, a + LEN) ){
printf("a=%d %d %d %d %d %d ",a[],a[],a[],a[],a[],a[]);
printf("can=%d %d\n",canto(a),canto2(a));
}
return ;
}
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
a= can=
hdu 5012 bfs 康托展开的更多相关文章
- hdu 1430 (BFS 康托展开 或 map )
第一眼看到这题就直接BFS爆搜,第一发爆了内存,傻逼了忘标记了,然后就改,咋标记呢. 然后想到用map函数,就8!个不同的排列,换成字符串用map标记.然后又交一发果断超时,伤心,最恨超时,还不如来个 ...
- hdu 1430(BFS+康托展开+映射+输出路径)
魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- HDU_1043 Eight 【逆向BFS + 康托展开 】【A* + 康托展开 】
一.题目 http://acm.hdu.edu.cn/showproblem.php?pid=1043 二.两种方法 该题很明显,是一个八数码的问题,就是9宫格,里面有一个空格,外加1~8的数字,任意 ...
- HDU 1043 Eight(双向BFS+康托展开)
http://acm.hdu.edu.cn/showproblem.php?pid=1043 题意:给出一个八数码,求出到达指定状态的路径. 思路:路径寻找问题.在这道题里用到的知识点挺多的.第一次用 ...
- HDU - 1430 魔板 【BFS + 康托展开 + 哈希】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1430 思路 我刚开始 想到的 就是 康托展开 但是这个题目是 多组输入 即使用 康托展开 也是会T的 ...
- POJ 1077 && HDU 1043 Eight A*算法,bfs,康托展开,hash 难度:3
http://poj.org/problem?id=1077 http://acm.hdu.edu.cn/showproblem.php?pid=1043 X=a[n]*(n-1)!+a[n-1]*( ...
- 【HDU - 1043】Eight(反向bfs+康托展开)
Eight Descriptions: 简单介绍一下八数码问题:在一个3×3的九宫格上,填有1~8八个数字,空余一个位置,例如下图: 1 2 3 4 5 6 7 8 在上图中,由于右下角位置是空的 ...
- hdu.1430.魔板(bfs + 康托展开)
魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- loj 1165(bfs+康托展开)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26879 思路:题目意思很简单,就是通过一些位置的交换,最后变成有序 ...
随机推荐
- mac上使用命令行显示隐藏文件
终端中输入命令 打开<终端> - 粘贴下面的两行命令执行 defaults write com.apple.finder AppleShowAllFiles TRUEkillall Fin ...
- win10搭建Java环境
一.下载地址 jdk和jre官方网址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 根据你的系统选择你需要 ...
- 多进程Queue
进程间通讯 不同进程间内存是不共享的,要想实现两个进程间的数据交换,可以用以下方法: Queues 使用方法跟threading里的queue差不多 from multiprocessing impo ...
- Bootstrap历练实例:块级按钮
<!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content=& ...
- UISearchBar的应用
当你在seachBar中输入字母之前的时候,只是用鼠标选中searchBar的时候,如图 终端输出截图如下:(这个时候调用先shouldBeginEditing,之后调用didBeginEditing ...
- ios之NSNumber
NSNumber + (NSNumber *)numberWithInt:(int)value; + (NSNumber *)numberWithDouble:(double)value; - (in ...
- 哪些 Python 库让你相见恨晚?
知乎用户,A European Swallow. 苇叶.Aran He.jerry等人赞同 补充三个有助于自动化日常工作的: sh:sh 1.08 — sh v1.08 documentation可以 ...
- Python运算符总结
一.简介 Python中运算符分为: 算术运算符:主要用于两个对象算数计算(加减乘除等运算) 比较(关系)运算符:用于两个对象比较(判断是否相等.大于等运算) 赋值运算符:用于对象的赋值,将运算符右边 ...
- [转载] Python数据类型知识点全解
[转载] Python数据类型知识点全解 1.字符串 字符串常用功能 name = 'derek' print(name.capitalize()) #首字母大写 Derek print(name.c ...
- Python9-文件操作-day8
# 1.文件路径:d:\xxx.txt# 绝对路径:从根目录开始# 想对路径:当前文件下# 2.编码方式:utf-8/gbk...# 3.操作方式:只读.只写.追加.读写.写读..... f=open ...