欸我一直以为双向bfs是搜完一半再搜另一半呢,妹想到是两个一起搜

然后队列里放的结构体里不能直接存答案,所以做一个邻接表一样的东西,直接指向需要的字符即可

记录状态用康托展开来hash

以及居然是多组数据啊?!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int N=500005,has[9]={1,1,2,6,24,120,720,5040,40320},dx[4]={-3,3,-1,1};
int v1[N],v2[N];
char a[30],d1[10]={"udlr"},d2[10]={"durl"};
string b="123456780";
struct qw
{
int a;
char ch;
qw(int A=0,char C=0)
{
a=A,ch=C;
}
}pre[N];
struct qwe
{
int a;
string c;
qwe(int A=0,string C="")
{
a=A,c=C;
}
}e;
void print(int x)
{
if(pre[x].a==-1)
return;
print(pre[x].a);
printf("%c",pre[x].ch);
}
int ha(string e)
{
int s=0,i,j,k;
for(i=0;i<9;i++)
{
k=0;
for(j=0;j<i;j++)
if(e[j]>e[i])
k++;
s+=k*has[i];
}
return s;
}
int main()
{
while(gets(a))
{
int k=0;
e.c="";
for(int i=0,j=0;i<strlen(a);i++)
if(a[i]!=' ')
{
if(a[i]=='x')
e.a=j,e.c+='0';
else
e.c+=a[i];
j++;
}
for(int i=0;i<9;i++)
if(e.c[i]!='0')
for(int j=0;j<i;j++)
if(e.c[j]!='0'&&e.c[j]>e.c[i])
k++;
memset(v2,0,sizeof(v2));
memset(v1,0,sizeof(v1));
if(k&1)
printf("unsolvable\n");
else
{
qwe f,g;
int a=2;
queue<qwe>q1,q2;
v1[ha(e.c)]=1;
pre[1].a=-1,pre[2].a=-1;
f=qwe(8,b);
v2[ha(f.c)]=2;
q1.push(e),q2.push(f);
while(!q1.empty()&&!q2.empty())
{
f=q1.front();
q1.pop();
int p=ha(f.c);
if(v2[p])
{
print(v1[p]);
for(int k=v2[p];pre[k].a!=-1;k=pre[k].a)
printf("%c",pre[k].ch);
printf("\n");
break;
}
for(int i=0;i<4;i++)
if((i!=0||f.a>=3)&&(i!=1||f.a<=5)&&(i!=2||f.a%3!=0)&&(i!=3||f.a%3!=2))
{
int x=f.a+dx[i];
g=f;
swap(g.c[f.a],g.c[x]);
int q=ha(g.c);
if(v1[q])
continue;
v1[q]=++a;
g.a=x;
pre[a]=qw(v1[p],d1[i]);
q1.push(g);
}
f=q2.front();
q2.pop();
p=ha(f.c);
if(v1[p])
{
print(v1[p]);
for(int k=v2[p];pre[k].a!=-1;k=pre[k].a)
printf("%c",pre[k].ch);
printf("\n");
break;
}
for(int i=0;i<4;i++)
if((i!=0||f.a>=3)&&(i!=1||f.a<=5)&&(i!=2||f.a%3!=0)&&(i!=3||f.a%3!=2))
{
int x=f.a+dx[i];
g=f;
swap(g.c[f.a],g.c[x]);
int q=ha(g.c);
if(v2[q])
continue;
v2[q]=++a;
g.a=x;
pre[a]=qw(v2[p],d2[i]);
q2.push(g);
}
}
printf("unsolvable\n");
}
}
return 0;
}

hdu 1043 Eight的更多相关文章

  1. POJ-1077 HDU 1043 HDU 3567 Eight (BFS预处理+康拓展开)

    思路: 这三个题是一个比一个令人纠结呀. POJ-1077 爆搜可以过,94ms,注意不能用map就是了. #include<iostream> #include<stack> ...

  2. HDU 1043 Eight(八数码)

    HDU 1043 Eight(八数码) 00 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)   Problem Descr ...

  3. Eight POJ - 1077 HDU - 1043 八数码

    Eight POJ - 1077 HDU - 1043 八数码问题.用hash(康托展开)判重 bfs(TLE) #include<cstdio> #include<iostream ...

  4. HDU - 1043 - Eight / POJ - 1077 - Eight

    先上题目: Eight Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  5. HDU 1043 Eight 八数码问题 A*算法(经典问题)

    HDU 1043 Eight 八数码问题(经典问题) 题意 经典问题,就不再进行解释了. 这里主要是给你一个状态,然后要你求其到达\(1,2,3,4,5,6,7,8,x\)的转移路径. 解题思路 这里 ...

  6. 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]*( ...

  7. hdu 1043 Eight 经典八数码问题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1043 The 15-puzzle has been around for over 100 years ...

  8. hdu 1043 pku poj 1077 Eight (BFS + 康拓展开)

    http://acm.hdu.edu.cn/showproblem.php?pid=1043 http://poj.org/problem?id=1077 Eight Time Limit: 1000 ...

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

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

  10. HDU 1043 Eight(反向BFS+打表+康托展开)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1043 题目大意:传统八数码问题 解题思路:就是从“12345678x”这个终点状态开始反向BFS,将各 ...

随机推荐

  1. Python字典(Dictionary)

    Python字典 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,格式如下所示: d = {key1 : value1, ...

  2. A Small Definition of Big Data

    A Small Definition of Big Data The term "big data" seems to be popping up everywhere these ...

  3. 九度oj 题目1074:对称平方数

    题目1074:对称平方数 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6422 解决:2912 题目描述: 打印所有不超过n(n<256)的,其平方具有对称性质的数. 如11*11 ...

  4. hdu 4871 树的分治+最短路记录路径

    /* 题意:给你一些节点和一些边,求最短路径树上是k个节点的最长的路径数. 解:1.求出最短路径树--spfa加记录 2.树上进行操作--树的分治,分别处理子树进行补集等运算 */ #include& ...

  5. 前端开发:HTML

    静态页面: 没有与用户进行交互,而仅仅是用户浏览的一个网页 动态网页:就是用户不仅仅可以浏览网页,还可以与服务器交互 Web前端应用场景:公司官网(在PC通过浏览器访问公司网站).移动端网页(在手机上 ...

  6. 【IntelliJ】IntelliJ IDEA常用设置及快捷键以及自定义Live templates

    IntelliJ IDEA是一款非常优秀的JAVA编辑器,初学都可会对其中的一些做法感到很别扭,刚开始用的时候我也感到很不习惯,在参考了网上一些文章后在这里把我的一些经验写出来,希望初学者能快速适应它 ...

  7. 2017 CCPC 杭州 HDU6265B 积性函数

    题目链接 http://acm.hdu.edu.cn/downloads/CCPC2018-Hangzhou-ProblemSet.pdf B题 数论题      h(n)=∑ d|n φ(d) × ...

  8. poj-1979 && hdoj - 1312 Red and Black (简单dfs)

    http://poj.org/problem?id=1979 基础搜索. #include <iostream> #include <cstdio> #include < ...

  9. NSA开发的工控ICS/SCADA态势感知开源工具Grassmarlin(附下载地址)

    工具简介 GRASSMARLIN是一款由美国国家安全局开发的,能够帮助运维工程师在IP网络上发现并编目监控和数据采集系统(SCADA)和工业控制系统(ICS)主机的开源软件工具,也被称为被动网络映射器 ...

  10. 【LeetCode-面试算法经典-Java实现】【067-Add Binary(二进制加法)】

    [067-Add Binary(二进制加法)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given two binary strings, return thei ...