【P1379】八数码难题(搜索+暴力)
这个题真是。。。
不想说什么了,及其复杂和烦人的一道题。基础思路就是bfs,用两个队列分别进行0的位置的计算和每一步的状态。。然而这个题最重要的一点在于判重,实际上可以康托展开用全排列的个数进行判重,这样也貌似好操作一些,但是时间短技术差想不到怎么办,通过计算空间,我们发现,可以暴力开一个9维bool数组进行暴力判重,至于怎么判也就不需要多说了,这种状态出现过就可以了。
###错误点1:bool数组不打标记,一直mle。。。
###错误点2:居然会有一开始就是目标状态的点。。。没有特判。。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define re register
#define ll long long
using namespace std;
short n,m,ans,t,d,l,h[][],x[][][];
int dx[]={,,,-,};
int dy[]={,,,,-};
char a[][];
bool b[][][][][][][][][];
int main()
{
for(int i=;i<;i++)
{
for(int j=;j<;j++)
{
cin>>a[i][j];
x[][i][j]=a[i][j]-'';
if(a[i][j]=='')
{
h[][]=i;
h[][]=j;
}
}
}
int head=,tail=;
if(x[tail][][]==&&x[tail][][]==&&x[tail][][]==&&x[tail][][]==&&x[tail][][]==&&x[tail][][]==&&x[tail][][]==&&x[tail][][]==&&x[tail][][]==)
{
cout<<;
return ;
}
h[][]=;
while(head<tail)
{
int nx=h[++head][];
int ny=h[head][];
int dep=h[head][];
for(re int i=;i<=;i++)
{
int tx=nx+dx[i];
int ty=ny+dy[i];
if(tx>=&&tx<&&ty>=&&ty<)
{
h[++tail][]=tx;
h[tail][]=ty;
h[tail][]=dep+;
for(re int j=;j<;j++)
{
for(re int k=;k<;k++)
{
x[tail][j][k]=x[head][j][k];
}
}
x[tail][nx][ny]=x[tail][tx][ty];
x[tail][tx][ty]=;
if(b[x[tail][][]][x[tail][][]][x[tail][][]][x[tail][][]][x[tail][][]][x[tail][][]][x[tail][][]][x[tail][][]][x[tail][][]])
{
tail--;
continue;
}
b[x[tail][][]][x[tail][][]][x[tail][][]][x[tail][][]][x[tail][][]][x[tail][][]][x[tail][][]][x[tail][][]][x[tail][][]]=;
if(x[tail][][]==&&x[tail][][]==&&x[tail][][]==&&x[tail][][]==&&x[tail][][]==&&x[tail][][]==&&x[tail][][]==&&x[tail][][]==&&x[tail][][]==)
{
cout<<dep+;
return ;
}
}
}
}
}
【P1379】八数码难题(搜索+暴力)的更多相关文章
- 洛谷 P1379 八数码难题 解题报告
P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初 ...
- 洛谷——P1379 八数码难题
P1379 八数码难题 双向BFS 原来双向BFS是这样的:终止状态与起始状态同时入队,进行搜索,只不过状态标记不一样而已,本题状态使用map来存储 #include<iostream> ...
- [luogu]P1379 八数码难题[广度优先搜索]
八数码难题 ——!x^n+y^n=z^n 我在此只说明此题的一种用BFS的方法,因为本人也是初学,勉勉强强写了一个单向的BFS,据说最快的是IDA*(然而蒟蒻我不会…) 各位如果想用IDA*的可以看看 ...
- 洛谷P1379八数码难题
题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中. 要求解的问题是:给出一种初始布局(初始状态)和目标布局(为 ...
- 洛谷 P1379 八数码难题
题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了 ...
- 洛谷—— P1379 八数码难题
https://daniu.luogu.org/problem/show?pid=1379 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示 ...
- 洛谷 P1379 八数码难题 Label:判重&&bfs
特别声明:紫书上抄来的代码,详见P198 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给 ...
- 【洛谷】P1379 八数码难题(bfs)
题目 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局 ...
- 洛谷 - P1379 - 八数码难题 - bfs
https://www.luogu.org/problemnew/show/P1379 #include <bits/stdc++.h> using namespace std; #def ...
随机推荐
- VMware Workstation网卡不启动
故障原因:虚拟机安装完成后,默认网络配置为”NAT”,对应真机的系统服务为“VMware NAT Service”默认情况下该服务启动类型为自动,状态为启动,若该服务未能正常启动则会导致如上报错,手动 ...
- 提高打开Android本地文档的速度
非常多Android开发人员在參考Android官方API时,都有一个令人头疼的问题:打开一个index.html平均都须要几分钟甚至更长.尤其是在打开API 8以上的版本号的时候.难道是网速不够好? ...
- @Resource 注解
@Resource 注解被用来激活一个命名资源(named resource)的依赖注入,在JavaEE应用程序中,该注解被典型地转换为绑定于JNDI context中的一个对象. Spring确实支 ...
- Win7系统安装 MySQL 5.7.23
1. 下载 MySQL 5.7版本:https://dev.mysql.com/downloads/mysql/5.7.html#downloads 2. 解压到指定文件夹,mysql根目录下创建my ...
- 【BZOJ4403】序列统计 Lucas定理
[BZOJ4403]序列统计 Description 给定三个正整数N.L和R,统计长度在1到N之间,元素大小都在L到R之间的单调不降序列的数量.输出答案对10^6+3取模的结果. Input 输入第 ...
- 20160924-2——mysql常见问题集锦
一.数据类型相关问题 1.varchar(N)占用多少空间 (1)varchar(N)里的N是字符数,而不是字节数: (2)字符类型(varchar text blob等)空间=字符实际长度+字段长度 ...
- 高并发服务器建议调小 TCP 协议的 time_wait 超时时间
说明:操作系统默认 240 秒后,才会关闭处于 time_wait 状态的连接,在高并发访问下,服 务器端会因为处于 time_wait 的连接数太多,可能无法建立新的连接,所以需要在服务器上 调小此 ...
- C语言结构体数组内带字符数组初始化和赋值
1.首先定义结构体数组: typedef struct BleAndTspRmtCmd{ char terminal[3]; char note[3]; char rmtCmd[10]; char c ...
- 在Nuxt中使用 Highcharts
npm进行highchars的导入,导入完成后就可以进行highchars的可视化组件开发了 npm install highcharts --save 1.components目录下新建一个char ...
- 002-unity3d插件使用
一.导入第三方的工具包(.unitypackage文件) 1.NGUI项 NGUI是一款收费的插件,在Asset Store中大家可以看到价格.在未购买正版的前提下我们可以通过两种方法来使用NGUI, ...