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> ...
随机推荐
- ubuntu server静态IP和DNS服务器设置
Ubuntu的网络参数保存在文件 /etc/network/interfaces中, 默认设置使用dhcp,动态IP获取. 设置静态ip的方法如下: 1) 编辑 /etc/network/inte ...
- DBA的工作职责和每日工作
DBA一般职责 1.安装和升级数据库服务器,以及应用程序工具构建和配置网络环境. 2.熟悉数据库系统的存储结构预测未来的存储需求,制订数据库的存储方案. 3.根据开发人员设计的应用系统需求创建数据库存 ...
- DevExress笔记
最近用DevExpress的WPF图表控件做柱形图看板,总结记录了一些笔记: 1.显示图例: <dxc:ChartControl.Legend> <dxc:Legend /> ...
- 分布式理论系列(三)ZAB 协议
分布式理论系列(三)ZAB 协议 在学习了 Paxos 后,接下来学习 Paxos 在开源软件 Zookeeper 中的应用. 一.Zookeeper Zookeeper 致力于提供一个高性能.高可用 ...
- Android Studio修改默认Activity继承AppCompatActivity
在Android Studio中新建Activity默认继承AppCompatActivity,感觉这点十分不爽,找了很久,终于发现在android Studio安装目录下有个模板文件,修改其中的参数 ...
- 【转】java遍历实体类的属性和数据类型以及属性值
和同学接了个外包的活,由于项目中很多地方要用到poi导出excel,而每次导出都要写很多相同的代码,因为poi的cell.setCellValue();每次设置的都是不同实体bean的属性值,导致代码 ...
- 安装Oracle数据库时出现网络配置需求检查失败
提示方法:将 Microsoft LoopBack Adapter 配置为系统的主网络适配器. 解决方法: 控制面板->添加硬件->是,(win7及之后没有添加硬件这个选项了,可以在c ...
- UVa 11136 Hoax or what (STL)
题意:有 n 天,每天有m个数,开始的前一天没有数据,然后每天从这个里面拿出一个最大的和最小的,求 n 天的最大的和最小的差值相加. 析:一看就知道用set啊,多简单的STL,不过要注意,开long ...
- awk基础02-变量-分隔符-数组
对任意一门语言都会有变量,在awk中变量分为内置变量和自定义变量. 内置变量:就是预先在awk中定义好的,用户可以直接使用 自定义变量:这种变量为用户自己定义的变量,需要先定义后再使用. 内置 ...
- ZOJ3696 Alien's Organ 2017-04-06 23:16 51人阅读 评论(0) 收藏
Alien's Organ Time Limit: 2 Seconds Memory Limit: 65536 KB There's an alien whose name is Marja ...