loj 1165(bfs+康托展开)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26879
思路:题目意思很简单,就是通过一些位置的交换,最后变成有序数列,对于一组序列,我们可以用康托展开然后hash判重。
然后就是普通的bfs,稍微留意一下细节即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int is_prime[]={,,,,,,,,,,,,,,,,,};
int fac[]={,,,,,,,,}; struct Point{
int num,flag;
}; struct Node{
Point state[];
int step;
}st; bool mark[]; int Get_Hash(Node &node)
{
int a[],val=,cnt;
for(int i=;i<;i++)a[i]=abs(node.state[i].num);
for(int i=;i<;i++){
cnt=;
for(int j=;j<i;j++){
if(a[j]>a[i])cnt++;
}
val+=cnt*fac[i];
}
return val;
} bool Judge(Node &node)
{
for(int i=;i<;i++){
if(abs(node.state[i].num)>abs(node.state[i+].num))
return false;
}
return true;
} Node Get_Node(Node &p,int pos1,int pos2,int dir)
{
//pos1->pos2 left
if(dir==){
if(pos1<pos2){
int tmp=p.state[pos1].num,flag=p.state[pos1].flag;
for(int i=pos1;i<=pos2-;i++){
p.state[i].num=p.state[i+].num;
p.state[i].flag=p.state[i+].flag;
}
p.state[pos2-].num=tmp;
p.state[pos2-].flag=flag;
}else {
int tmp=p.state[pos1].num,flag=p.state[pos1].flag;
for(int i=pos1;i>pos2;i--){
p.state[i].num=p.state[i-].num;
p.state[i].flag=p.state[i-].flag;
}
p.state[pos2].num=tmp,p.state[pos2].flag=flag;
}
}else if(dir==){ //pos1->pos2 right
if(pos1<pos2){
int tmp=p.state[pos1].num,flag=p.state[pos1].flag;
for(int i=pos1;i<=pos2-;i++){
p.state[i].num=p.state[i+].num;
p.state[i].flag=p.state[i+].flag;
}
p.state[pos2].num=tmp,p.state[pos2].flag=flag;
}else {
int tmp=p.state[pos1].num,flag=p.state[pos1].flag;
for(int i=pos1;i>=pos2+;i--){
p.state[i].num=p.state[i-].num;
p.state[i].flag=p.state[i-].flag;
}
p.state[pos2+].num=tmp,p.state[pos2+].flag=flag;
}
}
return p;
} void bfs()
{
memset(mark,false,sizeof(mark));
queue<Node>que;
que.push(st);
mark[Get_Hash(st)]=true;
while(!que.empty()){
Node q,pp,p=que.front();
que.pop();
if(Judge(p)){
printf("%d\n",p.step);
return ;
}
for(int i=;i<;i++){
for(int j=;j<;j++)if(i!=j){
if(p.state[i].flag!=p.state[j].flag&&is_prime[abs(p.state[i].num)+abs(p.state[j].num)]){
for(int k=;k<;k++){
pp=p;
q=Get_Node(pp,i,j,k);
int val=Get_Hash(q);
q.step=p.step+;
if(!mark[val]){
mark[val]=true;
que.push(q);
}
}
}
}
}
}
puts("-1");
} int main()
{
int _case,t=;
scanf("%d",&_case);
while(_case--){
for(int i=;i<;i++){
scanf("%d",&st.state[i].num);
st.state[i].flag=(st.state[i].num>?:-);
}
st.step=;
printf("Case %d: ",t++);
bfs();
}
return ;
}
loj 1165(bfs+康托展开)的更多相关文章
- HDU_1043 Eight 【逆向BFS + 康托展开 】【A* + 康托展开 】
一.题目 http://acm.hdu.edu.cn/showproblem.php?pid=1043 二.两种方法 该题很明显,是一个八数码的问题,就是9宫格,里面有一个空格,外加1~8的数字,任意 ...
- hdu1430魔板(BFS+康托展开)
做这题先看:http://blog.csdn.net/u010372095/article/details/9904497 Problem Description 在魔方风靡全球之后不久,Rubik先 ...
- Aizu0121 Seven Puzzle(bfs+康托展开)
https://vjudge.net/problem/Aizu-0121 比八数码要水的多,bfs. 但是做的时候我把康托展开记错了,wa了好几次. 附上康托展开博客详解:https://blog.c ...
- 蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)
Description 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的 ...
- HDU 1043 Eight(双向BFS+康托展开)
http://acm.hdu.edu.cn/showproblem.php?pid=1043 题意:给出一个八数码,求出到达指定状态的路径. 思路:路径寻找问题.在这道题里用到的知识点挺多的.第一次用 ...
- hdu 1430(BFS+康托展开+映射+输出路径)
魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- HDU_1430 魔板 【BFS+康托展开+置换】
一.题面 POJ1430 二.分析 该题与之前做的八数码不同,它是一个2*4的棋盘,并且没有空的区域.这样考虑的情况是很少的,依然结合康托展开,这时康托展开最多也只乘7的阶乘,完全可以BFS先预处理一 ...
- HDU - 1430 魔板 【BFS + 康托展开 + 哈希】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1430 思路 我刚开始 想到的 就是 康托展开 但是这个题目是 多组输入 即使用 康托展开 也是会T的 ...
- hdu 5012 bfs 康托展开
Dice Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submi ...
随机推荐
- Substance风格实例大全javaswing皮肤风格大全(原)
转载请注明来路:http://www.cnblogs.com/langtianya/ 下图是所支持的设置 下面把上面的每一个选项的子选项进行试验 substance皮肤: AutumnSkin Bus ...
- 漫长Appium之路(二)——Appium安装与使用总结
前面介绍了iOS自动化工具的Appium所需的虚拟机环境,接下来介绍下Appium的安装与使用方法,这个足足折腾我将近一个星期.网上没有什么详细的资料,对于遇到的各种各样问题也没用提供明确的解决方法. ...
- css 伪类::after ::beftor 的使用方式
注释:对于 IE8 及更早版本中的 :before,必须声明 . ::before和::after这两个主要用来给元素的前面或后面插入内容,这两个常用"content"配合使用,见 ...
- POJ 3274 Gold Balanced Lineup
Gold Balanced Lineup Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10924 Accepted: 3244 ...
- UESTC 1817 Complete Building the Houses
Complete Building the Houses Time Limit: 2000MS Memory Limit: 65535KB 64bit IO Format: %lld & %l ...
- 如何实现在已有代码之后添加逻辑之java动态代理
在上篇博客中讨论到java的静态代理, 就是通过组合的方法,前提是委托类需要实现一个接口,代理类也实现这个这个 接口,从何组合两个类,让代理类给委托类添加功能! 知道java的静态代理,我们又遇到一个 ...
- HDU 1025 Constructing Roads In JGShining's Kingdom(求最长上升子序列nlogn算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1025 解题报告:先把输入按照r从小到大的顺序排个序,然后就转化成了求p的最长上升子序列问题了,当然按p ...
- UIScrollview使用
改变内容偏移 - (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated; // animate at const ...
- GDB 使用大法
一.GDB 我用的是 GCC+POWERSHELL+GDB, GDB刚刚接触也有很多要记的. 二.一个调试示例 tst.c #include <stdio.h> int func(int ...
- HDOJ 1864 最大报销额(01背包)
http://acm.hdu.edu.cn/showproblem.php?pid=1864 最大报销额 Time Limit: 1000/1000 MS (Java/Others) Memor ...