[LUOGU2730] 魔板
搜索水题。因为只有8个数,排列一共有40320种,直接bfs,判重就行了。
但是判重的时候直接用8进制表示的话要88的bool数组。这种操作太low了,于是我们可以用康托展开,降成8!。
康托展开其实就是一个简单的公式,很好意会。。。。
#include <iostream>
#include <cstdlib>
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
const int fac[]={,,,,,,,,,};
int rnk;
bool vis[];
struct Node{
int a[],step,pre;
char c;
}a,q[];
int cantor(Node b) {
int ans=;
for(int i=;i<=;i++) {
int cnt=;
for(int j=i+;j<=;j++) {
if(b.a[j]<b.a[i]) cnt++;
}
ans+=(cnt*fac[-i]);
}
return ans;
}
Node A(Node x) {
for(int i=;i<=;i++) swap(x.a[i],x.a[-i]);
return x;
}
Node B(Node x) {
swap(x.a[],x.a[]),swap(x.a[],x.a[]);
swap(x.a[],x.a[]),swap(x.a[],x.a[]);
swap(x.a[],x.a[]),swap(x.a[],x.a[]);
return x;
}
Node C(Node x) {
swap(x.a[],x.a[]),swap(x.a[],x.a[]),swap(x.a[],x.a[]);
return x;
}
int h,t;
void print(Node x) {
if(!x.pre) return;
print(q[x.pre]); printf("%c",x.c); }
void bfs() {
h++,t++;
for(int i=;i<;i++)q[].a[i]=i;
while(h<=t) {
bool flag=;
for(int i=;i<=;i++) if(q[h].a[i]!=a.a[i]) {flag=;break;}
if(flag) {printf("%d\n",q[h].step),print(q[h]);exit();}
Node tp;int kt;
tp=A(q[h]);kt=cantor(tp);
if(!vis[kt]){vis[kt]=;q[++t]=tp;q[t].step++,q[t].pre=h;q[t].c='A';}
tp=B(q[h]);kt=cantor(tp);
if(!vis[kt]){vis[kt]=;q[++t]=tp;q[t].step++;q[t].pre=h;q[t].c='B';}
tp=C(q[h]);kt=cantor(tp);
if(!vis[kt]){vis[kt]=;q[++t]=tp;q[t].step++;q[t].pre=h;q[t].c='C';}
h++;
}
}
int main() {
for(int i=;i<=;i++) scanf("%d",&a.a[i]);
bfs();
}
Magic Squares
[LUOGU2730] 魔板的更多相关文章
- Sicily 1051: 魔板(BFS+排重)
相对1150题来说,这道题的N可能超过10,所以需要进行排重,即相同状态的魔板不要重复压倒队列里,这里我用map储存操作过的状态,也可以用康托编码来储存状态,这样时间缩短为0.03秒.关于康托展开可以 ...
- Sicily 1150: 简单魔板(BFS)
此题可以使用BFS进行解答,使用8位的十进制数来储存魔板的状态,用BFS进行搜索即可 #include <bits/stdc++.h> using namespace std; int o ...
- hdu.1430.魔板(bfs + 康托展开)
魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- HDU 1430 魔板(康托展开+BFS+预处理)
魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- [HDU 1430] 魔板
魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- hdu1430魔板(BFS+康托展开)
做这题先看:http://blog.csdn.net/u010372095/article/details/9904497 Problem Description 在魔方风靡全球之后不久,Rubik先 ...
- Sicily1151:魔板搜索及优化
最终优化代码地址: https://github.com/laiy/Datastructure-Algorithm/blob/master/sicily/1151.c 题目如下 Constraints ...
- 【USACO 3.2.5】魔板
[描述] 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 我们知道魔板的每一个方格都有一种颜色.这8种颜色用前8个 ...
- HDU_1430——魔板,预处理,康托展开,置换,string类的+操作
Problem Description 在魔方风靡全球之后不久,Rubik先生发明了它的简化版——魔板.魔板由8个同样大小的方块组成,每个方块颜色均不相同,可用数字1-8分别表示.任一时刻魔板的状态可 ...
随机推荐
- mysql 服务器监控系列-黄杉 mysqldba
http://blog.csdn.net/mchdba/article/category/2220809
- 生成字符Banner
生成字符Banner http://patorjk.com/software/taag __ _______/ |_ ____ ____ ____ / ___/\ __\/ _ \ / \ / _ \ ...
- 公告:CSDN博客积分系统升级(暂行版)
各位亲爱的用户: CSDN博客频道将于2014年10月22日23点至10月23日8点进行积分系统的升级,升级期间会影响大家的正常訪问和操作.给大家带来不便.敬请广大用户谅解.很多其它详情见>&g ...
- Python——迭代器和解析(3)
用迭代工具模拟zip和map ====================================================================== 我们已经知道了zip怎样组合 ...
- C++开发人脸性别识别教程(19)——界面美化
在这篇博文中将完毕<C++开发人脸性别识别>的收尾工作.主要内容分为两部分:加入视频暂定功能.界面规范化. 一 视频暂停功能 严格来说这个视频暂定功能算是视频人脸性别识别的一个遗留问题,本 ...
- 问题1-The type java.lang.String cannot be resolved. It is indirectly referenced from required .class files
问题一:The type java.lang.String cannot be resolved. It is indirectly referenced from required .class f ...
- spring 源码解析
1. [文件] spring源码.txt ~ 15B 下载(167) ? 1 springн┤┬вио╬Ш: 2. [文件] spring源码分析之AOP.txt ~ 15KB 下载( ...
- 原生mysql读出来数据有乱码
加入这个后mysql_query("set names utf8");,可以将读出来的数据变成utf8的格式,可能是解决问题的一个好方法.
- BZOJ 1196 二分+Kruskal
思路: 二分答案 判一下能不能加 //By SirisuRen #include <cstdio> #include <cstring> #include <algori ...
- Vim常用又容易忘的命令
一篇讲的不错的教程 :noh 取消搜索高亮 x 删当前光标所在的一个字符. :wq 存盘 + 退出 dd 删除当前行,并把删除的行存到剪贴板里 p 粘贴剪贴板 a → 在光标后插入 /pattern ...