Orz双向搜索的cy大神

我用的是hash 也蛮快的

//By SiriusRen
#include <queue>
#include <cstdio>
using namespace std;
#define mod 1000007
struct node{char a[4][4],cnt;}a,b;
char xx[]={1,-1,0,0},yy[]={0,0,1,-1};
int vis[1000007],jy,f;
queue<node>q;
bool check(int x,int y){
int temp=0;
if(x>=1&&x<=3&&y>=1&&y<=3){
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
temp=temp*10+a.a[i][j];
}
}
temp%=mod;
if(temp==jy){f=1;return 1;}
if(!vis[temp]){vis[temp]=1;return 1;}
return 0;
}
return 0;
}
int main(){
scanf("%c%c%c%c%c%c%c%c%c",&a.a[1][1],&a.a[1][2],&a.a[1][3],&a.a[2][1],&a.a[2][2],&a.a[2][3],&a.a[3][1],&a.a[3][2],&a.a[3][3]);
for(int i=1;i<=3;i++)for(int j=1;j<=3;j++)a.a[i][j]-='0';
b.a[1][1]=1,b.a[1][2]=2,b.a[1][3]=3,b.a[2][1]=8,b.a[2][3]=4,b.a[3][1]=7,b.a[3][2]=6,b.a[3][3]=5;
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
jy=jy*10+b.a[i][j];
}
}
jy%=mod;
q.push(a);
while(!q.empty()){
// for(int i=1;i<=3;i++)for(int j=1;j<=3;j++)printf("%d",a.a[i][j]);puts("");
a=q.front();q.pop();\
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
if(a.a[i][j]==0){
a.cnt++;
for(int k=0;k<=3;k++){
swap(a.a[i+xx[k]][j+yy[k]],a.a[i][j]);
if(check(i+xx[k],j+yy[k])){
if(f){printf("%d ",a.cnt);goto end;}
q.push(a);
}
swap(a.a[i+xx[k]][j+yy[k]],a.a[i][j]);
}
}
}
}
}
end:;
}

TYVJ 1541 八数码的更多相关文章

  1. A*算法 -- 八数码问题和传教士过河问题的代码实现

    前段时间人工智能的课介绍到A*算法,于是便去了解了一下,然后试着用这个算法去解决经典的八数码问题,一开始写用了挺久时间的,后来试着把算法的框架抽离出来,编写成一个通用的算法模板,这样子如果以后需要用到 ...

  2. 八数码问题:C++广度搜索实现

    毕竟新手上路23333,有谬误还请指正. 课程设计遇到八数码问题(这也是一坨),也查过一些资料并不喜欢用类函数写感觉这样规模小些的问题没有必要,一开始用深度搜索却发现深搜会陷入无底洞,如果设定了深度限 ...

  3. ACM/ICPC 之 BFS-广搜进阶-八数码(经典)(POJ1077+HDU1043)

    八数码问题也称为九宫问题.(本想查查历史,结果发现居然没有词条= =,所谓的历史也就不了了之了) 在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上标的数字不相同.棋盘上还有一个 ...

  4. BFS(八数码) POJ 1077 || HDOJ 1043 Eight

    题目传送门1 2 题意:从无序到有序移动的方案,即最后成1 2 3 4 5 6 7 8 0 分析:八数码经典问题.POJ是一次,HDOJ是多次.因为康托展开还不会,也写不了什么,HDOJ需要从最后的状 ...

  5. 双向广搜+hash+康托展开 codevs 1225 八数码难题

    codevs 1225 八数码难题  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond   题目描述 Description Yours和zero在研究A*启 ...

  6. UVALive 6665 Dragon’s Cruller --BFS,类八数码问题

    题意大概就是八数码问题,只不过把空格的移动方式改变了:空格能够向前或向后移动一格或三格(循环的). 分析:其实跟八数码问题差不多,用康托展开记录状态,bfs即可. 代码: #include <i ...

  7. P1379 八数码问题

    aoapc上的八数码问题,在luogu上也有类似的题,p1379,经典题目,lrj给出了一个算法,同时给出了三种判重的方法.本来想用std::queue改写一下,但是出了各种问题,只好抄代码ac掉这道 ...

  8. [cdoj1380] Xiper的奇妙历险(3) (八数码问题 bfs + 预处理)

    快要NOIP 2016 了,现在已经停课集训了.计划用10天来复习以前学习过的所有内容.首先就是搜索. 八数码是一道很经典的搜索题,普通的bfs就可求出.为了优化效率,我曾经用过康托展开来优化空间,甚 ...

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

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

随机推荐

  1. Java并发包

    刚看到一篇总结的比较全的JUC包总结,转载如下: 1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.con ...

  2. nginx的安装步骤

    nginx学习资料;https://zhuanlan.zhihu.com/p/34943332 1.下载nginx的安装包:https://nginx.org/en/download.html 2. ...

  3. MongoDB在MacOS上的客户端Robo 3T 的简单使用(二)

    最近写了一个用node来操作MongoDB完成增.删.改.查.排序.分页功能的示例,并且已经放在了服务器上地址:http://39.105.32.180:3333. 本篇文章只做简单介绍,能够使用起来 ...

  4. Comparison of programming languages

    The following table compares general and technical information for a selection of commonly used prog ...

  5. MAC 下的pycharm部分使用方法

    1.在创建之初,可以选择自己想要使用的python版本. 如果之后想要更换Python版本,可以通过~~~更换选择Python版本. 2.创建.py文件,点击文件名,出现如下界面: 点击new--py ...

  6. ZBrush中关于标记的特殊情况

    在ZBrush®中使用Marker标记调控板来记忆物体属性,因此能在任何时间回到标记并使用它给其他物体或改变物体作为参考点,在使用Marker标记调控板时回出现很多特殊情况,本文小编就这些特殊情况做一 ...

  7. 扩大缩小Linux物理分区大小

    由于产品在不同的标段,设备硬盘也不同, 有些500G,有些320G有些200G,开始在大硬盘上做的配置,想把自己定制好的Linux克隆到小硬盘上,再生龙会纠结空间大小的问题, 因此需要做一些分区的改变 ...

  8. 关于表格元素的使用,table、<width>、<heigh>、<border>、<tr>、<th>、<td>、<align>、<colspan>、<rowspan>

    <html>    <head>        <meta charset="UTF-8">        <title>个人简历& ...

  9. 【Django】遇到的问题

    目前的Django版本是Django version 2.0.4 Python使用的版本是Python 3.6.4 以下会将遇到的问题和各种报错信息记录 报错信息:NameError: name 'u ...

  10. 注解实战Beforeclass和Afterclass

    package com.course.testng;import org.testng.annotations.*; public class BasicAnnotation { //最基本的注解,用 ...