蓝桥杯 历届试题 九宫重排 (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, ...
随机推荐
- HDU1698(KB7-E 线段树)
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU1069(KB12-C)
Monkey and Banana Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- Stylus基本使用
介绍 在学习一个 Vue.js 项目的过程中,注意到源码中样式的部分并没有用熟悉的 .css 样式文件,而是发现了代码长得和 CSS 相像的 .styl 文件.这个 .styl 以前没见过啊,你是谁? ...
- eclipse java web项目经常自动调试进入debug模式
今天在运行Javaweb项目时,程序运行运行着就自动调试进入ThreadpoolExecutor,看着非常影响心情.最后在网上搜解决方法最后找到原因,解决方法如下. Window——>Prefe ...
- svn本地连接服务器失败,但是浏览器可以
tortoise svn无法连接到服务器,清空“Autherticate data”后,再进行更新,提交,log查看等操作,svn还是不提示输入用户名和密码,而是报: error: Unable to ...
- HTTP协议学习随笔
一 HTTP概述 HTTP简单说其实就是一套语言交流规则!Http使用的是可靠的数据传输协议,因此即使数据来自地球的另一端,也能够确保数据在传输过程中不会被损坏或产生混乱. B/S结构 用户在浏览器, ...
- Mac下使用VScode进行C/C++开发
1.安装 从VScode官网下载Mac系统适用的VScode安装包,下载完成后,将zip安装包解压到桌面即可. 2.插件安装 实现 C/Cpp 代码自动补全,函数跳转. 打开VScode后,按下组合键 ...
- maven学习笔记--maven项目创建
使用Maven命令和Eclipse的Maven插件,创建Maven项目 (1)maven命令生成项目 新建一个文件目录,dos进入该目录并执行下面命令: mvn archetype:c ...
- MySQL 性能监控4大指标——第一部分
[编者按]本文作者为 John Matson,主要介绍 mysql 性能监控应该关注的4大指标. 第一部分将详细介绍前两个指标: 查询吞吐量与查询执行性能.文章系国内 ITOM 管理平台 OneAPM ...
- MySQL出现Waiting for table metadata lock的场景浅析
MySQL版本为5.6.12. 在进行alter table操作时,有时会出现Waiting for table metadata lock的等待场景.而且,一旦alter table TableA的 ...