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

我们把第一个图的局面记为:12345678.
把第二个图的局面记为:123.46758
显然是按从上到下,从左到右的顺序记录数字,空格记为句点。
本题目的任务是已知九宫的初态和终态,求最少经过多少步的移动可以到达。如果无论多少步都无法到达,则输出-1。
Input
Output
Sample Input
样例输入1
12345678.
123.46758 样例输入2
13524678.
46758123.
Sample Output
样例输出1
3 样例输出2
22
Source
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define INF 99999999
#define me(a,x) memset(a,x,sizeof(a))
int mon1[]= {,,,,,,,,,,,,};
int mon2[]= {,,,,,,,,,,,,};
int dir[][]= {{,},{,-},{,},{-,}};
int fac[] = {, , , , , , , , , };//i的阶乘 LL getval()
{
LL ret();
char c;
while((c=getchar())==' '||c=='\n'||c=='\r');
ret=c-'';
while((c=getchar())!=' '&&c!='\n'&&c!='\r')
ret=ret*+c-'';
return ret;
}
void out(int a)
{
if(a>)
out(a/);
putchar(a%+'');
}
int kt(int a[],int n)//康托展开
{
int ans=;
for(int i=;i<=n;i++)
{
int c=;
for(int j=i+;j<=n;j++)
{
if(a[j]<a[i])
c++;
}
ans+=(c*fac[n-i]);
}
return ans+;
} char str1[],str2[];
int a[][],b[][];
int sx,sy;
int t[];
int h;
int w;
bool vis[]; struct node
{
int x,y,step;//x,y代表空格位置
int c[][];//九宫格数组
node(int xx,int yy,int ss,int cc[][])//初始化
{
x=xx;
y=yy;
step=ss;
for(int i=; i<=; i++)
for(int j=; j<=; j++)
c[i][j]=cc[i][j];
}
int getkt()//得到结点数组的康托展开值
{
h=;
for(int i=;i<=;i++)
{
for(int j=;j<=;j++)
{
t[h++]=c[i][j];
}
}
return kt(t,);
}
}; void init()//初始化
{
int cnt=;
for(int i=; i<=; i++)//得到原始九宫格
{
for(int j=; j<=; j++)
{
if(str1[cnt]=='.')
a[i][j]=,sx=i,sy=j;
else
a[i][j]=str1[cnt]-'';
cnt++;
}
}
cnt=;
for(int i=; i<=; i++)//得到目标九宫格
{
for(int j=; j<=; j++)
{
if(str2[cnt]=='.')
b[i][j]=;
else
b[i][j]=str2[cnt]-'';
cnt++;
}
}
me(vis,false);//九宫格状态数组
h=;
for(int i=;i<=;i++)//得到目标九宫格的康托展开值
{
for(int j=;j<=;j++)
{
t[h++]=b[i][j];
}
}
w=kt(t,);
}
int check(int x,int y)//边界约束
{
if(x<=&&x>=&&y<=&&y>=)
return ;
return ;
}
int bfs(int x,int y,int a[][])
{
queue<node> q; q.push(node(x,y,,a));
vis[node(x,y,,a).getkt()]=; while(!q.empty())
{
int x=q.front().x;
int y=q.front().y;
int step=q.front().step;
int c[][];
for(int i=; i<=; i++)
for(int j=; j<=; j++)
c[i][j]=q.front().c[i][j];
q.pop(); for(int i=; i<; i++)
{
int xx=x+dir[i][];
int yy=y+dir[i][];
int ss=step+; int cc[][];
if(check(xx,yy)==)//越界
continue; for(int i=; i<=; i++)
for(int j=; j<=; j++)
cc[i][j]=c[i][j];
cc[x][y]=cc[xx][yy];//移动
cc[xx][yy]=; if(vis[node(xx,yy,ss,cc).getkt()]==)//判断该状态的九宫格有没有搜索过
{
if(node(xx,yy,ss,cc).getkt()==w)//搜索到了目标
{
return ss;//返回步数
}
int temp=node(xx,yy,ss,cc).getkt(); vis[temp]=;//标记该状态的九宫格已经搜索过
q.push(node(xx,yy,ss,cc));
} }
}
return -;
}
int main()
{
while(~scanf("%s",str1))
{
scanf("%s",str2);
init(); int ans=bfs(sx,sy,a);
printf("%d\n",ans);
}
}
蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)的更多相关文章
- Java实现 蓝桥杯 历届试题 九宫重排
问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为:12 ...
- 算法笔记_183:历届试题 九宫重排(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成 ...
- 蓝桥杯OJ PREV-19 九宫重排
题目描写叙述: 历届试题 九宫重排 时间限制:1.0s 内存限制:256.0MB 问题描写叙述 如以下第一个图的九宫格中,放着 1~8 的数字卡片.另一个格子空着.与空格子相 ...
- 蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索
问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ...
- 2013年第四届蓝桥杯国赛 九宫重排(HashMap+双BFS优化)
九宫重排 时间限制:1.0s 内存限制:256.0MB 问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干 ...
- 蓝桥杯 历届试题 剪格子(dfs搜索)
历届试题 剪格子 时间限制:1.0s 内存限制:256.0MB 问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+ |* || +--****--+ ||* | ** ...
- 蓝桥杯 历届试题 网络寻路(dfs搜索合法路径计数)
X 国的一个网络使用若干条线路连接若干个节点.节点间的通信是双向的.某重要数据包,为了安全起见,必须恰好被转发两次到达目的地.该包可能在任意一个节点产生,我们需要知道该网络中一共有多少种不同的转发路径 ...
- 蓝桥杯 历届试题 约数倍数选卡片 (经典数论+DFS)
闲暇时,福尔摩斯和华生玩一个游戏: 在N张卡片上写有N个整数.两人轮流拿走一张卡片.要求下一个人拿的数字一定是前一个人拿的数字的约数或倍数.例如,某次福尔摩斯拿走的卡片上写着数字“6”,则接下来华生可 ...
- 蓝桥杯 历届试题 幸运数 dfs
历届试题 幸运数 时间限制:1.0s 内存限制:256.0MB 问题描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成 . 首先从1开始写出自然数1,2, ...
随机推荐
- HDU3592(差分约束)
World Exhibition Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU5840(SummerTrainingDay08-B 树链剖分+分块)
This world need more Zhu Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- DVWA的安装
DVWA(Dam Vulnerable Web Application)是基于PHP+Mysql的一套用于常规Web漏洞教学和检测Web脆弱性测试程序,包含了SQL注入,Xss,盲注等常用的一些安全漏 ...
- framework7中a标签没反应
试试在a标签上加这个样式: class="external"
- Android手机上,利用bat脚本模拟用户操作
………… 那么你就可以来看看这篇帖子了. 言归正传 利用bat脚本模拟用户操作,需要用到两点: ①就是adb命令了,adb命令可以用来模拟用户在手机上的操作 ②bat语言,就是批处理语言,主要用来进行 ...
- 【Zookeeper】Zookeeper集群单节点提供服务
以下只在特殊情况下使用,不要用在生产环境. 一.问题背景 公司的产品使用Zookeeper做为集群支持,但是客户在验收的时候提出了一个很为难人的要求,那就是3台集群服务,停止2台以后,还要求我们的应用 ...
- 【Redis】Redis学习(一) Redis初步入门
一.Redis基础知识 1.1 Redis简介 Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理.它支持字符串.哈希表.列表.集合.有序集合,位图,h ...
- qtcreator minggw 支持c++11
pro文件添加 QMAKE_CXXFLAGS += -std=c++11
- 回归JavaScript基础(十)
主题:创建对象 原型模式 JavaScript中的每个对象都有一个prototype属性(原型属性),这个属性是一个指针,指向一个对象,而这个对象可以由一些属性和方法组成.被指向的对象,可以是多个对象 ...
- 在命令行中创建Django项目
1.终端先进入你要放项目的目录. 在命令行输入:django-admin startproject 项目名 .回车,此时创建了一个项目. 例:django-admin startproject my ...