题目链接: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+康托展开)的更多相关文章

  1. HDU_1043 Eight 【逆向BFS + 康托展开 】【A* + 康托展开 】

    一.题目 http://acm.hdu.edu.cn/showproblem.php?pid=1043 二.两种方法 该题很明显,是一个八数码的问题,就是9宫格,里面有一个空格,外加1~8的数字,任意 ...

  2. hdu1430魔板(BFS+康托展开)

    做这题先看:http://blog.csdn.net/u010372095/article/details/9904497 Problem Description 在魔方风靡全球之后不久,Rubik先 ...

  3. Aizu0121 Seven Puzzle(bfs+康托展开)

    https://vjudge.net/problem/Aizu-0121 比八数码要水的多,bfs. 但是做的时候我把康托展开记错了,wa了好几次. 附上康托展开博客详解:https://blog.c ...

  4. 蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)

    Description 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的 ...

  5. HDU 1043 Eight(双向BFS+康托展开)

    http://acm.hdu.edu.cn/showproblem.php?pid=1043 题意:给出一个八数码,求出到达指定状态的路径. 思路:路径寻找问题.在这道题里用到的知识点挺多的.第一次用 ...

  6. hdu 1430(BFS+康托展开+映射+输出路径)

    魔板 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  7. HDU_1430 魔板 【BFS+康托展开+置换】

    一.题面 POJ1430 二.分析 该题与之前做的八数码不同,它是一个2*4的棋盘,并且没有空的区域.这样考虑的情况是很少的,依然结合康托展开,这时康托展开最多也只乘7的阶乘,完全可以BFS先预处理一 ...

  8. HDU - 1430 魔板 【BFS + 康托展开 + 哈希】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1430 思路 我刚开始 想到的 就是 康托展开 但是这个题目是 多组输入 即使用 康托展开 也是会T的 ...

  9. hdu 5012 bfs 康托展开

    Dice Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submi ...

随机推荐

  1. C++中虚函数的作用浅析

    虚函数联系到多态,多态联系到继承.所以本文中都是在继承层次上做文章.没了继承,什么都没得谈. 下面是对C++的虚函数这玩意儿的理解. 一, 什么是虚函数(如果不知道虚函数为何物,但有急切的想知道,那你 ...

  2. iOS上传应用过程中出现的错误"images contain alpha channels or transparencies"以及解决方案

    如何取消图片透明度  本文永久地址为 http://www.cnblogs.com/ChenYilong/p/3989954.html,转载请注明出处. 当你试图通过<预览>进行" ...

  3. Entity Framework ModelFirst尝试

    前言 Model First我们称之为“模型优先”,这里的模型指的是“ADO.NET Entity Framework Data Model”,此时你的应用并没有设计相关数据库,在Visual Stu ...

  4. Mate7微信指纹支付来了 比Touch ID整合微信早一点

    之前我们聊过微信将推指纹支付 "指付通"会与Touch ID整合吗这个话题,现在有国内厂商率先支持微信指纹支付,体验一下美国用户使用Apple Pay搭配Touch ID来实现便捷 ...

  5. Card(bestcoder #26 B)

    Card Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  6. web_url、web_custom_request、web_submit_data、web_submit_form的使用实例

    业务:根据url获取图片用web_url()函数访问数据;请求方式:HTTP GET 请求;Action(){web_url("imageproxytest", "URL ...

  7. mstsc局域网远程 要预先做的设置

    很简单========= 一:在“控制面板”->“管理工具”->“服务”上启动Remote Desktop Help Session Manager的服务; 二: 在“控制面板”-> ...

  8. Linux shell判断文件和文件夹是否存在

    shell判断文件,目录是否存在或者具有权限 #!/bin/sh myPath="/var/log/httpd/" myFile="/var /log/httpd/acc ...

  9. 8个开发必备的PHP功能

    做过PHP开发的程序员应该清楚,PHP中有很多内置的功能,掌握了它们,可以帮助你在做PHP开发时更加得心应手,本文将分享8个开发必备的PHP功能,个个都非常实用,希望各位PHP开发者能够掌握. 1.传 ...

  10. VIM替换、截取及追加操作

    参考: http://blog.csdn.net/love__coder/article/details/6739670 http://blog.csdn.net/love__coder/articl ...