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> ...
随机推荐
- 磁盘512n,512e,4k原生磁盘的区别和操作系统支持
磁盘按照物理扇区大小的不同分为三种512byte原生扇区硬盘(512n),4KB扇区仿真512byte(512E)磁盘,4kB扇区原生磁盘. 首先说物理扇区,扇区是硬盘上最小的读写单位,这个是硬盘决定 ...
- 各大主流.Net的IOC框架性能测试比较(转)
出处:http://www.cnblogs.com/liping13599168/archive/2011/07/17/2108734.html 在上一篇中,我简单介绍了下Autofac的使用,有人希 ...
- 8.3 mysql 表操作
库操作 一 系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等 performance_sch ...
- Mysql--关于数值字段的比较问题
今天在进行数据库查询的过程中,因为需要比较一条记录中两个字段的大小问题 select * from cyber_download_rate where measure_time between '20 ...
- dojo学习(一)入门
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- UIWebView清除缓存和cookie[转]
现在项目遇到一个问题,游戏底层用Cocos2d-x,公告UI实现是用的UIWebView, 然后第一次在有网络的环境下运行公告UI,会加载url链接,同时就会自动存入缓存,当下次手机没有网络的环境下, ...
- swift学习之UITabelView ----使用xib定义cell
// // TwoViewController.swift // tab // // Created by su on 15/12/7. // Copyright © 2015年 tian. ...
- win server 2012 R2 你需要先安装 对应于 KB2919355 的更新
产生阻滞的问题: 你需要先安装 对应于 KB2919355 的更新 ,然后才可在 Windows 8.1 或 Windows Server 2012 R2 上安装此产品. 官方说法(这些 KB 必须按 ...
- C# 加载配置文件
//加载配置文件 var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .Add ...
- (转载)Oracle的悲观锁和乐观锁
为了得到最大的性能,一般数据库都有并发机制,不过带来的问题就是数据访问的冲突.为了解决这个问题,大多数数据库用的方法就是数据的锁定. 数据的锁定分为两种方法,第一种叫做悲观锁,第二种叫做乐观锁.什么叫 ...