题目描写叙述:

  历届试题 九宫重排  
时间限制:1.0s   内存限制:256.0MB
      
问题描写叙述
  如以下第一个图的九宫格中,放着 1~8 的数字卡片。另一个格子空着。与空格子相邻的格子中的卡片能够移动到空格中。经过若干次移动。能够形成第二个图所看到的的局面。



  我们把第一个图的局面记为:12345678.

  把第二个图的局面记为:123.46758

  显然是按从上到下,从左到右的顺序记录数字,空格记为句点。

  本题目的任务是已知九宫的初态和终态,求最少经过多少步的移动能够到达。假设不管多少步都无法到达,则输出-1。
输入格式
  输入第一行包括九宫的初态,第二行包括九宫的终态。

输出格式
  输出最少的步数,假设不存在方案,则输出-1。

例子输入
12345678.

123.46758
例子输出
3
例子输入
13524678.

46758123.
例子输出
22

题解: BFS+HASH~~ 第一次用hash,之前一直超时。

代码:

#include<iostream>
#include<cstdio>
char star[10],send[10];
int nodedir=0,exdir=0;
bool visit[200000000]={0};
int dir[4][2]={
{0,1},
{0,-1},
{1,0},
{-1,0},
};
const int Max=200000;
struct Node{
int a[3][3],x,y,step;
} map[Max],temp,end;
int hash(Node x)
{
int num=1,sum=0;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
if(x.a[i][j])
{
num=x.a[i][j];
for(int k=0;k<i*3+j;k++)
num*=8;
sum+=num;
}
return sum;
}
int main()
{
scanf("%s%s",star,send);
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
{
if(star[i*3+j]>'0'&&star[i*3+j]<'9')
map[0].a[i][j]=star[i*3+j]-'0';
else if(star[i*3+j]=='.'){
map[0].a[i][j]=0;
map[0].x=i; map[0].y=j;
}
if(send[i*3+j]>'0'&&send[i*3+j]<'9')
end.a[i][j]=send[i*3+j]-'0';
else{ end.a[i][j]=0;
end.x=i; end.y=j;
}
}
visit[hash(end)]=1;
visit[hash(map[0])]=1;
map[0].step=0;
while(nodedir<=exdir&&exdir<Max)
{
for(int i=0;i<4;i++)
{
temp=map[nodedir];
int dx=temp.x+dir[i][0],dy=temp.y+dir[i][1];
if(dx>=0&&dx<3&&dy>=0&&dy<3)
{
int t;
t=temp.a[temp.x][temp.y];
temp.a[temp.x][temp.y]=temp.a[dx][dy];
temp.a[dx][dy]=t;
temp.x=dx; temp.y=dy; temp.step++;
if(hash(temp)==hash(end))
{
printf("%d\n",temp.step);
return 0;
}
if(!visit[hash(temp)])
map[++exdir]=temp;
visit[hash(temp)]=1;
}
}
nodedir++;
}
printf("-1\n");
return 0;
}

蓝桥杯OJ PREV-19 九宫重排的更多相关文章

  1. 蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)

    Description 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的 ...

  2. 2013年第四届蓝桥杯国赛 九宫重排(HashMap+双BFS优化)

    九宫重排     时间限制:1.0s   内存限制:256.0MB 问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干 ...

  3. 2019第十届蓝桥杯C++B组题解(赛后重写的,不确保答案正确性,仅供参考)

    先说一下这次的感受吧,我们考场比较乱,开始比赛了,还有的电脑有故障,(向这些人发出同情),第一次认真参加比赛,真正比赛的时候感觉没有那么正式,很乱,各种小问题,(例如博主就没找到题目在哪里,找到后又不 ...

  4. 算法笔记_183:历届试题 九宫重排(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成 ...

  5. 记 2019蓝桥杯校内预选赛(JAVA组) 赛后总结

    引言 好像博客好久没更新了 哈哈哈哈哈 趁现在有空更新一波 不知道还有没有人看 确实该记录一下每天做了什么了 不然感觉有些浑浑噩噩了 比赛介绍 全称: 蓝桥杯全国软件和信息技术专业人才大赛 蓝桥杯 实 ...

  6. BFS解决九宫重排问题

    问题 1426: [蓝桥杯][历届试题]九宫重排 时间限制: 1Sec 内存限制: 128MB 提交: 215 解决: 47 题目描述 如下面第一个图的九宫格中,放着  1~8  的数字卡片,还有一个 ...

  7. 2012年 蓝桥杯预赛 java 本科 题目

    2012年 蓝桥杯预赛 java 本科 考生须知: l  考试时间为4小时. l  参赛选手切勿修改机器自动生成的[考生文件夹]的名称或删除任何自动生成的文件或目录,否则会干扰考试系统正确采集您的解答 ...

  8. 第六届蓝桥杯软件类省赛题解C++/Java

    第六届蓝桥杯软件类省赛题解C++/Java 1[C++].统计不含4的数字统计10000至99999中,不包含4的数值个数.答:暴力循环范围内所有数字判断一下就是了,答案是52488 1[Java]. ...

  9. 蓝桥杯java历年真题及答案整理1~20.md

    蓝桥杯java历年真题及答案整理(闭关一个月,呕心沥血整理出来的) 1 算法是这样的,如果给定N个不同字符,将这N个字符全排列,最终的结果将会是N!种.如:给定 A.B.C三个不同的字符,则结果为:A ...

随机推荐

  1. 【转】axios的基本使用

    axios的基本使用 vue更新到2.0之后,作者就宣告不再对vue-resource更新,而是推荐的 axios 基于 Promise 的 HTTP 请求客户端,可同时在浏览器和 node.js 中 ...

  2. C# 获取NTP远程同步时间

    收到一个需要定时同步远程服务器的需求,用C# 实现 网上搜索到解决方案,代码如下: 获取远程时间 参数配置:"NTPServer"  远程时间服务器地址 获取远程服务器时间代码: ...

  3. Long.ValueOf("String") Long.parseLong("String") 区别 看JAVA包装类的封箱与拆箱

    IP地址类型转换原理: 将一个点分十进制IP地址字符串转换成32位数字表示的IP地址(网络字节顺序). 将一个32位数字表示的IP地址转换成点分十进制IP地址字符串. 1.Long.ParseLong ...

  4. spoj 8222 NSUBSTR 求长度为x的子串中出现次数最大值 SAM

    题目大意 给一个字符串S 令F(x)表示S的所有长度为x的子串中 出现次数的最大值. 求F(1)..F(Length(S)) 分析 一个节点\(x\)的长度有\(~~(max(fa),max(x)]\ ...

  5. ng-show和ng-hide的进阶应用

    在数据列表渲染的时候,我们可能不仅有一层数据,可能是三级甚至更多,如果我们要显示或者隐藏对应的数据,那么就需要给数据进行子scope的绑定.如下 html <div ng-app="d ...

  6. eclipse 同一个package 有的文件 中文乱码,有的文件中文正常

    1.这是编码格式导致的. 先在对应包名上右击,选择属性,将包内所有的文件都设置为GBK格式, 然后查看每个文件,如果有乱码,则将这个文件的编码格式单独设为 UTF-8 2.有个项目使用百度语音做开发, ...

  7. shell 执行提示No such file or directory

    问题描述: 项目开发过程中ansible执行脚本失败,单独运行shell脚本提示:No such file or directory,脚本结构执行脚本a 调用另一脚本b, 但查看b脚本路径正确不存在找 ...

  8. 八、 Java程序初始化的顺序(一)

    今天在写构造器方法的时候,遇到了一个小问题,由这个问题引发了一连串的思考,在一个Java类中变量与类的初始化执行顺序是什么样的呢?## 发现问题 class Student{ private Stri ...

  9. Python学习杂记_5_列表常用操作

    列表操作 列表时用方括号括起来的一组元素值,是可变变量,可通过下表取值,也可以通过下表来修改值,列表中的元素是有序的,可以是不同的基本数据类型,如: names=[1, 2, 3, “abc”, “d ...

  10. uva 177:Paper Folding(模拟 Grade D)

    题目链接 题意:一张纸,每次从右往左对折.折好以后打开,让每个折痕都自然的呈90度.输出形状. 思路:模拟折……每次折想象成把一张纸分成了正面在下的一张和反面在上的一张.维护左边和方向,然后输出.细节 ...