P1379 八数码难题

题目描述

在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字。棋盘中留有一个空格,空格用0来表示。空格周围的棋子可以移到空格中。要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变。

输入输出格式

输入格式:

输入初始状态,一行九个数字,空格用0表示

输出格式:

只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数(测试数据中无特殊无法到达目标状态数据)


虽然这个题没有用到,但还是提一下有解性判断

当棋盘长度是奇数时,有解等价于初始状态与目标状态的抽出来横着放的序列中逆序对个数的奇偶性相同

正常的解题思路:

用康托展开判重,用曼哈顿距离估价搜索

然而我最开始打的记搜wa的不行

最后终于想明白,有环记搜个锤子啊!!!

事实上状态量很少,直接广搜就可以


Code:

#include <cstdio>
#include <cstring>
const int N=1e6;
int s[10],fac[10],step[N],used[N],l,r;
int a[10]={0,2,3,4,9,1,5,8,7,6};
void add(int x){while(x<=9) ++s[x],x+=x&-x;}
int ask(int x){int su=0;while(x) su+=s[x],x-=x&-x;return su;}
struct node
{
int a[10];
}q[N];
int kanton(node x)
{
int ans=0;memset(s,0,sizeof(s));
for(int i=1;i<=9;i++)
ans+=fac[9-i]*(x.a[i]-1-ask(x.a[i])),add(x.a[i]);
return ans;
}
void swap(int &x,int &y){int tmp=x;x=y,y=tmp;}
int main()
{
fac[0]=1;node s;
for(int i=1;i<=9;i++) fac[i]=fac[i-1]*i,s.a[i]=a[i];
int to=kanton(s);
char c[10];scanf("%s",c+1);
for(int i=1;i<=9;i++) s.a[i]=c[i]-'0'+1;
q[0]=s;step[0]=0;
while(l<=r)
{
node now=q[l++];
int id=kanton(now),pos;
if(id==to) {printf("%d\n",step[l-1]);break;}
if(used[id]) continue;used[id]=1;
for(int i=1;i<=9;i++) if(now.a[i]==1) {pos=i;break;}
if(pos%3!=1)
{
node t=now;
swap(t.a[pos],t.a[pos-1]);
q[++r]=t,step[r]=step[l-1]+1;
}
if(pos%3)
{
node t=now;
swap(t.a[pos],t.a[pos+1]);
q[++r]=t,step[r]=step[l-1]+1;
}
if(pos>3)
{
node t=now;
swap(t.a[pos],t.a[pos-3]);
q[++r]=t,step[r]=step[l-1]+1;
}
if(pos<7)
{
node t=now;
swap(t.a[pos],t.a[pos+3]);
q[++r]=t,step[r]=step[l-1]+1;
}
}
return 0;
}

2018.8.30

洛谷 P1379 八数码难题 解题报告的更多相关文章

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

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

  2. 洛谷P1379八数码难题

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

  3. 洛谷 P1379 八数码难题 Label:判重&&bfs

    特别声明:紫书上抄来的代码,详见P198 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给 ...

  4. 洛谷 P1379 八数码难题

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

  5. 洛谷 - P1379 - 八数码难题 - bfs

    https://www.luogu.org/problemnew/show/P1379 #include <bits/stdc++.h> using namespace std; #def ...

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

    https://daniu.luogu.org/problem/show?pid=1379 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示 ...

  7. 洛谷 P1379 八数码难题(map && 双向bfs)

    题目传送门 解题思路: 一道bfs,本题最难的一点就是如何储存已经被访问过的状态,如果直接开一个bool数组,空间肯定会炸,所以我们要用另一个数据结构存,STL大法好,用map来存,直接AC. AC代 ...

  8. 洛谷P1379 八数码难题

    传送门 1.先用dfs枚举9!的全排列,存到hash数组里(类似离散化),因为顺序枚举,就不需要排序了 2.朴素bfs,判重就用二分找hash:如果发现当前状态=要求状态,输出步数结束程序 上代码 # ...

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

    我个人感觉就是一道bfs的变形,还是对bfs掌握不好的人有一定难度. 本题思路: 大体上用bfs搜,用map来去重,在这里只需要一个队列,因为需要较少步数达到的状态一定在步数较多的状态之前入队列. # ...

随机推荐

  1. elasticsearch 5.x 系列之四(索引模板的使用,详细得不要不要的)

    1,首先看一下下面这个索引模板 curl -XPUT "master:9200/_template/template_1?pretty" -H 'Content-Type: app ...

  2. vue笔记 介绍及安装 一

    Vue.js 是什么 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层, ...

  3. C语言实例解析精粹学习笔记——36(模拟社会关系)

    实例: 设计一个模拟社会关系的数据结构,每个人的信息用结构表示,包含名字.性别和指向父亲.母亲.配偶.子女的指针(只限两个子女).要求编写以下函数: (1)增加一个新人的函数 (2)建立人与人之间关系 ...

  4. c#vs连接SQL sever数据库入门操作

    对于需要连接数据库的项目,可以参考的简单初级代码.实现打开数据库,读入数据功能 using System; using System.Collections.Generic; using System ...

  5. Kubernetes-DNS

    Kubernetes提供的虚拟DNS服务名为skydns,由四个组件组成: etcd:DNS存储 kube2sky:将Kubernetes Master中的Service(服务)注册到etcd sky ...

  6. 详解 RPL、DPL、CPL 的关系

    保护模式中最重要的一个思想就是通过分级把代码隔离了起来,不同的代码在不同的级别,使大多数情况下都只和同级代码发生关系.Intel的80286以上的cpu可以识別4个特权级(或特权层) ,0级到3级.数 ...

  7. Hibernate-ORM:14.Hibernate中的命名查询

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客讲述命名查询,所谓命名查询是什么呢? Hibernate中允许我们在xml,实体类,甚至注解的方式来编 ...

  8. JMeter上传图片

    JMeter怎样上传图片? 请注意图片的路径要与.jmx脚本的目录保持一致, 或者放在JMeter的bin目录下. 协议:http 服务器名称或IP:www.abcdef.com 方法:POST 路径 ...

  9. 系统学习Docker 践行DevOps理念

    Docker代表的容器技术是近两年的大热技术,和人工智能.区块链等热点不同,容器技术的门槛并不高,每一个开发.测试.运维人员都能在日常工作中掌握和使用,是当今IT从业人员的必备技能之一.本课程会带大家 ...

  10. 5、shader混合(Blending)、雾

    直接上效果图:queue:transparent 雾: fog { mode exp color(0.6,0.4,0.3,0.8) density 0.3 range ,0.8 } 效果: http: ...