[ZJOI2005]九数码游戏
[ZJOI2005]九数码游戏
题目描述
输入输出格式
输入格式:
输入文件中包含三行三列九个数,同行的相邻两数用空格隔开,表示初始状态每个方格上的数字。初始状态不会是目标状态。
输出格式:
如果目标状态无法达到,则输出“UNSOLVABLE”(引号不输出)。
否则,第一行是一个整数S,表示最少的操作次数。接下来4 × (S + 1)行,每四行表示一个状态:前三行每行三个整数,相邻两数用空格隔开,表示每个方格上的数字,第四行是一个空行,作为分隔。第一个状态必须是初始状态,最后一个状态必须是目标状态。
输入输出样例
2 3 0
1 8 7
5 4 6
4
2 3 0
1 8 7
5 4 6 1 2 3
5 8 0
4 6 7 1 2 3
0 5 8
4 6 7 0 1 2
4 5 3
6 7 8 0 1 2
3 4 5
6 7 8 因为这是3*3的全排列矩阵变换;
最多有9!(362880)种状态;
用BFS,搜到终点为止,中间记录一下路径;
将3*3的全排列映射成一一对应的数,可以用康托展开;
最好不要用map,可能会超时;
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std; int a[],q[],st,ed,b[],f[],ge,ans;
int c[],hash[];
int fac[]={,,,,,,,,}; int calc1()
{
int i,j,t,sum;
sum=;
for(i=;i<;i++)
{
t=;
for(j=i+;j<;j++)
if(a[i]>a[j])
++t;
sum+=t*fac[-i-];
}
return sum+;
} int calc()
{
int i,j,t,sum;
sum=;
for(i=;i<;i++)
{
t=;
for(j=i+;j<;j++)
if(b[i]>b[j])
++t;
sum+=t*fac[-i-];
}
return sum+;
} void fen(int x)
{
int i,j,t,vst[]={};
x--;
for(i=;i<;i++)
{
t=x/fac[-i-];
for(j=;j<;j++)
if(!vst[j])
{
if(t==) break;
--t;
}
b[i]=j;
vst[j]=;
x%=fac[-i-];
}
} int main()
{
int x=;
for(int i=;i<=;i++)
for(int j=;j<=;j++){
scanf("%d",&a[(i-)*+j-]);
}
x=calc1();
ge=;
if(x==ge){
printf("");
return ;
}
q[]=x;
hash[x]=-;
st=; ed=;
while(st<ed){
int x=q[++st];
fen(x);
for(int i=;i<;i++)
f[i]=b[i];
b[]=f[];
b[]=f[];
b[]=f[];
int y=calc();
if(hash[y]==){
hash[y]=x;
ed++;
q[ed]=y;
}
if(y==ge)
break;
b[]=f[];
b[]=f[];
b[]=f[]; b[]=f[];
b[]=f[];
b[]=f[];
b[]=f[];
b[]=f[];
b[]=f[];
b[]=f[];
b[]=f[]; y=calc();
if(hash[y]==){
hash[y]=x;
ed++;
q[ed]=y;
}
if(y==ge)
break;
}
x=hash[ge];
if(x==){
printf("UNSOLVABLE\n");
return ;
}
while(x!=-){
ans++;
c[ans]=x;
x=hash[x];
}
printf("%d\n",ans);
for(int i=ans;i>;i--){
fen(c[i]);
printf("%d %d %d\n",b[],b[],b[]);
printf("%d %d %d\n",b[],b[],b[]);
printf("%d %d %d\n",b[],b[],b[]);
printf("\n");
}
if(ans>=){
printf("0 1 2\n");
printf("3 4 5\n");
printf("6 7 8\n");
}
}
[ZJOI2005]九数码游戏的更多相关文章
- [ZJOI2005]九数码游戏(BFS+hash)
Solution 这题的话直接上BFS就可以了,因为要输出方案,所以我们要开一个pre数组记录前驱,最后输出就可以了. 对于状态的记录,一般都用哈希来存,但因为这道题比较特殊,它是一个排列,所以我们可 ...
- 洛谷 P2578 [ZJOI2005]九数码游戏【bfs+康托展开】
只有9!=362880个状态,用康托展开hash一下直接bfs即可 #include<iostream> #include<cstdio> #include<cstrin ...
- 万圣节后的早晨&&九数码游戏——双向广搜
https://www.luogu.org/problemnew/show/P1778 https://www.luogu.org/problemnew/show/P2578 双向广搜. 有固定起点终 ...
- LG2578 「ZJOI2005」九数码游戏 bfs
问题描述 LG2578 题解 用string+map去重. bfs即可. \(\mathrm{Code}\) #include<bits/stdc++.h> using namespace ...
- 洛谷 - P2578 - 九数码游戏 - bfs
https://www.luogu.org/problemnew/show/P2578 一个挺搞的东西,用康托展开做记忆化搜索可以少一个log的查询. #include <bits/stdc++ ...
- C#_界面程序_数码游戏
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- ZJOI2017 Day1
私のZJOI Day1 2017-3-21 07:52:53 有人在暴力膜 苟-- 富贵 无相忘 ZJOI2017交流群 133135071 如果你足够厉害 如果你足够厉害 如果你足够厉害 其实完全可 ...
- [学习笔记]搜索——模拟与dp的结合
搜索: 一种基础的算法. 考察常见于NOIP 但是高级的搜索算法可能还会在省选出现. 50%以上的暴力都可以用搜索直接枚举来写. 但是,当数据规模不是很大的时候,搜索也可能成为正解. (比如剪枝PK状 ...
- HDU 1043 Eight 八数码问题 A*算法(经典问题)
HDU 1043 Eight 八数码问题(经典问题) 题意 经典问题,就不再进行解释了. 这里主要是给你一个状态,然后要你求其到达\(1,2,3,4,5,6,7,8,x\)的转移路径. 解题思路 这里 ...
随机推荐
- Matlab生成.exe可执行程序
由于在教学过程中需要演示Matlab程序,而教学机又未安装Matlab程序,因此有必要将Matlab程序生成.exe可执行程序,便于直接执行. 在Matlab中提供了Complier,可直接使用. ( ...
- JAVA基础第七组(5道题)
31.题目:将一个数组逆序输出. 1.程序分析:用第一个与最后一个交换. package com.niit.homework1; /** * @author: Annie * ...
- 201521123001《Java程序设计》第7周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 参考资料: XMind 答: 大多数情况下,从性能上来说ArrayList最好,但是当集合内的元素需要频繁插入.删除时Lin ...
- java第十三次作业
1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相内关容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...
- java 如何判断操作系统是Linux还是Windows
String os = System.getProperty("os.name"); if(os.toLowerCase().startsWith("win") ...
- 如何在Oracle官网下载历史版本JDK
打开Oracle官网,准备下载java JDK(下载时需要使用注册用户登陆,可以免费注册) 官网地址:http://www.oracle.com/ 2 鼠标悬停Downloads,会出现相关内容,如下 ...
- windows10 下安装node失败 出现2502 2503的解决办法
下载node出现以下异常 : the install has encountered an unexpected errer installing this package.this may i ...
- 初入ubuntu
登入root :su root 安装 vim: sudo apt-get install vim 安装 gcc(g++):sudo apt-get install gcc(g++) 非常实用的修改分辨 ...
- BZOJ2431_逆序对数列_KEY
转自YXDs 题目传送门 不知道今天是怎么了,可能是空调吹多了吧,一直不在状态,连递推题我都做不来了--(扎Zn了老Fe--) 然而,不管环境如何恶劣,我们仍要努力学习,为了自己的明天而奋斗.(说的好 ...
- hadoop 基本命令
hdfs相关 1.查看HDFS文件目录 hadoop fs -ls / mapreduce相关 1.查看mapred job mapred job -list hadoop job -list Use ...