八数码-->BFS+set

 #include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<set>
using namespace std;
struct aaa{
int map[][];
int dep,x,y;
}que[];
set<int> ssr;
int head=,tail=;
int dx[]={,,-,,};
int dy[]={,,, ,-};
int start[][];
int goal[][]={{,,,},{,,,},{,,,},{,,,}};
int temp[][];
char putt[];
long long ans;
/*int judge()
{
int i,j,k;
for(i=1;i<=tail;i++)
{
bool p=1;
for(j=1;j<=3;j++)
for(k=1;k<=3;k++)
if(que[i].map[j][k]!=temp[j][k])
p=0;
if(p==1)
return 0;
}
return 1;
}*/ int judge()
{
long long num=;
int l,k;
for(l=;l<=;l++)
for(k=;k<=;k++)
num=num*+temp[l][k];
pair<set<int>::iterator,bool>f=ssr.insert(num);
return f.second;
}
int win(){
int i,j;
for(i=;i<=;i++)
for(j=;j<=;j++)
if(temp[i][j]!=goal[i][j])
return ;
return ;
}
void bfs()
{
int i,j;
memcpy(temp,start,sizeof (start));
if(win())
return;
memcpy(que[tail].map,start,sizeof (start));
for(i=;i<=;i++)
for(j=;j<=;j++)
{
if(start[i][j]==)
{
que[tail].x=i;que[tail].y=j;
break;
}
} while(head<tail)
{
head++;
for(i=;i<=;i++)
{
int newx=que[head].x+dx[i];
int newy=que[head].y+dy[i];
if(newx>=&&newy>=&&newx<=&&newy<=)
{
memcpy(temp,que[head].map,sizeof(temp));//
swap(temp[newx][newy],temp[que[head].x][que[head].y]);
if(judge())
{
tail++;
que[tail].x=newx;
que[tail].y=newy;
memcpy(que[tail].map,temp,sizeof(temp));
que[tail].dep=que[head].dep+;
if(win())
{
ans=que[tail].dep;
return;
}
}
}
}
}
}
int main()
{
int i,j;
scanf("%s",putt);
for(i=;i<=;i++)
start[(i-)/+][(i-)%+]=putt[i-]-;
bfs();
printf("%d",ans);
return ;
}

luogu_1379 八数码难题的更多相关文章

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

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

  2. Codevs 1225 八数码难题

    1225 八数码难题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Yours和zero在研究A*启发式算法.拿到一道经典的 ...

  3. [luogu]P1379 八数码难题[广度优先搜索]

    八数码难题 ——!x^n+y^n=z^n 我在此只说明此题的一种用BFS的方法,因为本人也是初学,勉勉强强写了一个单向的BFS,据说最快的是IDA*(然而蒟蒻我不会…) 各位如果想用IDA*的可以看看 ...

  4. 洛谷P1379八数码难题

    题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中. 要求解的问题是:给出一种初始布局(初始状态)和目标布局(为 ...

  5. 洛谷 P1379 八数码难题 解题报告

    P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初 ...

  6. 【洛谷P1379】八数码难题(广搜、A*)

    八数码难题 题目描述 一.广搜: 首先要考虑用什么存每一个状态 显然每个状态都用一个矩阵存是很麻烦的. 我们可以考虑将一个3*3的矩阵用一个字符串或long long 存. 每次扩展时再转化为矩阵. ...

  7. 习题:八数码难题(双向BFS)

    八数码难题(wikioi1225) [题目描述] 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出 ...

  8. 「LuoguP1379」 八数码难题(迭代加深

    [P1379]八数码难题 - 洛谷 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种 ...

  9. 洛谷——P1379 八数码难题

    P1379 八数码难题 双向BFS 原来双向BFS是这样的:终止状态与起始状态同时入队,进行搜索,只不过状态标记不一样而已,本题状态使用map来存储 #include<iostream> ...

随机推荐

  1. Halcon中xld的常见特征的含义总结

    如下图:

  2. loadrunner--web_url函数用法

    web_url语法:        Int Web_url(const char *name, const char * url, <Lists of Attributes>, [EXTR ...

  3. Luogu 4512 【模板】多项式除法

    高级操作,感觉非常神仙. 题目中的字母太难懂了,重新定义一下. $$A(x) = B(x) * C(x) + D(x)$$ 其中,$A(x)$的次数是$n$,$B(x)$的次数是$m$,$A, B$都 ...

  4. App启动页设计实例与技巧

    App启动页,也称闪屏页,最初是为缓解用户等待Web/iOS/Android App数据加载的焦虑情绪而出现,后被设计师巧妙用于品牌文化展示,服务特色介绍以及功能界面熟悉等平台进行设计,被赋予了更加丰 ...

  5. 关于anroid设置webview背景方法探讨(转)

    最近的项目中一直关于webView设置背景色问题在研究,最终找到了解决的方法. 基于我项目的需求,从服务端传过来的是带有标签的文本,如果使用textView会让整个布局显得很乱,里面的<img ...

  6. xml数据改动

    public void reXml ( string namepngname ) { XmlDocument doc = new XmlDocument(); doc.Load(_xmlpath); ...

  7. 深入浅出python系列(一)包与模块

    一.包 包是由一系列模块组成的,模块简单就说是一个.py文件.比如说,现在有一个数学功能组,可以计算加.减.乘.除.幂运算等等,假定把这几个功能分成几个模块,一个模块就是一个.py文件.由这些不同的模 ...

  8. 从Objective-C到Swift,你必须会的(一)#pragma mark

    在Objective-C里,为了让代码组织的有序也方便用control+6的快捷键在Xcode中查找,所以出现了一个大家都很熟悉的东东.这就是:#prama mark. #pragma mark  但 ...

  9. 机器学习—集成学习(GBDT)

    一.原理部分: 图片形式~ 二.sklearn实现: 可以看看这个:https://blog.csdn.net/han_xiaoyang/article/details/52663170 1.分类: ...

  10. Objective-C 学习笔记(二) 函数

    Objective-C 函数 定义一个方法 在Objective-C编程的方法定义的一般形式如下: - (return_type) method_name:( argumentType1 )argum ...