luogu_1379 八数码难题
八数码-->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 八数码难题的更多相关文章
- 双向广搜+hash+康托展开 codevs 1225 八数码难题
codevs 1225 八数码难题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Yours和zero在研究A*启 ...
- Codevs 1225 八数码难题
1225 八数码难题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Yours和zero在研究A*启发式算法.拿到一道经典的 ...
- [luogu]P1379 八数码难题[广度优先搜索]
八数码难题 ——!x^n+y^n=z^n 我在此只说明此题的一种用BFS的方法,因为本人也是初学,勉勉强强写了一个单向的BFS,据说最快的是IDA*(然而蒟蒻我不会…) 各位如果想用IDA*的可以看看 ...
- 洛谷P1379八数码难题
题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中. 要求解的问题是:给出一种初始布局(初始状态)和目标布局(为 ...
- 洛谷 P1379 八数码难题 解题报告
P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初 ...
- 【洛谷P1379】八数码难题(广搜、A*)
八数码难题 题目描述 一.广搜: 首先要考虑用什么存每一个状态 显然每个状态都用一个矩阵存是很麻烦的. 我们可以考虑将一个3*3的矩阵用一个字符串或long long 存. 每次扩展时再转化为矩阵. ...
- 习题:八数码难题(双向BFS)
八数码难题(wikioi1225) [题目描述] 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出 ...
- 「LuoguP1379」 八数码难题(迭代加深
[P1379]八数码难题 - 洛谷 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种 ...
- 洛谷——P1379 八数码难题
P1379 八数码难题 双向BFS 原来双向BFS是这样的:终止状态与起始状态同时入队,进行搜索,只不过状态标记不一样而已,本题状态使用map来存储 #include<iostream> ...
随机推荐
- Halcon中xld的常见特征的含义总结
如下图:
- loadrunner--web_url函数用法
web_url语法: Int Web_url(const char *name, const char * url, <Lists of Attributes>, [EXTR ...
- Luogu 4512 【模板】多项式除法
高级操作,感觉非常神仙. 题目中的字母太难懂了,重新定义一下. $$A(x) = B(x) * C(x) + D(x)$$ 其中,$A(x)$的次数是$n$,$B(x)$的次数是$m$,$A, B$都 ...
- App启动页设计实例与技巧
App启动页,也称闪屏页,最初是为缓解用户等待Web/iOS/Android App数据加载的焦虑情绪而出现,后被设计师巧妙用于品牌文化展示,服务特色介绍以及功能界面熟悉等平台进行设计,被赋予了更加丰 ...
- 关于anroid设置webview背景方法探讨(转)
最近的项目中一直关于webView设置背景色问题在研究,最终找到了解决的方法. 基于我项目的需求,从服务端传过来的是带有标签的文本,如果使用textView会让整个布局显得很乱,里面的<img ...
- xml数据改动
public void reXml ( string namepngname ) { XmlDocument doc = new XmlDocument(); doc.Load(_xmlpath); ...
- 深入浅出python系列(一)包与模块
一.包 包是由一系列模块组成的,模块简单就说是一个.py文件.比如说,现在有一个数学功能组,可以计算加.减.乘.除.幂运算等等,假定把这几个功能分成几个模块,一个模块就是一个.py文件.由这些不同的模 ...
- 从Objective-C到Swift,你必须会的(一)#pragma mark
在Objective-C里,为了让代码组织的有序也方便用control+6的快捷键在Xcode中查找,所以出现了一个大家都很熟悉的东东.这就是:#prama mark. #pragma mark 但 ...
- 机器学习—集成学习(GBDT)
一.原理部分: 图片形式~ 二.sklearn实现: 可以看看这个:https://blog.csdn.net/han_xiaoyang/article/details/52663170 1.分类: ...
- Objective-C 学习笔记(二) 函数
Objective-C 函数 定义一个方法 在Objective-C编程的方法定义的一般形式如下: - (return_type) method_name:( argumentType1 )argum ...