[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\)的转移路径. 解题思路 这里 ...
随机推荐
- MPLS LDP随堂笔记2
前一天排错 Acl 1 匹配所有ospf的数据包 (目的 ospf建立邻居关系 传递路由条目) 2 放行UDP报文 让LDP邻居能互相收发HELLO包 4 放行TCP报文 让LDP邻居能够建立TCP会 ...
- 201521123047 《Java程序设计》第4周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 答: - 只能有一个父类,即单继承,子类继承父类的全部成员(属性和方法),并可能有自己特有的 ...
- Java第十四周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自 ...
- 201521123009 《Java程序设计》第1周学习总结
1. 本周学习总结 对Java进行了了解与简单的学习.第一次接触Java觉得比较难理解. 希望之后的深入学习可以解决目前的一些问题. 2. 书面作业 为什么java程序可以跨平台运行?执行java程序 ...
- HTTP属性管理器详解
1)HTTP Cache Manager 2)HTTP Cookie 管理器 3)HTTP 信息头管理器 4)HTTP 授权管理器 5)HTTP 请求默认值 为什么会有这些http属性的配置元件? ...
- Python循环列表删除元素问题
有人会遇到这种问题,遍历列表,想删除列表中的某几个元素,执行后发现有些并没有删除到, 比如以下代码 a=[1,2,3,4,5,6]print(a) for i in a: if i==3 or i== ...
- merge 语法解析
merge into 支持sqlserver 2008 和以上的版本 无论是INSERT还是UPDATE,从执行之间上看,MERGE INTO(MERGE)都要比直接INSERT/UPDATE的效率高 ...
- HDFS概述(6)————用户手册
目的 本文档是使用Hadoop分布式文件系统(HDFS)作为Hadoop集群或独立通用分布式文件系统的一部分的用户的起点.虽然HDFS旨在在许多环境中"正常工作",但HDFS的工作 ...
- 【重点突破】——Cookie的使用
cookie:小甜饼 cookie:保存客户端浏览器中一个纯文本文件 版本高的浏览器可查看 F12->Resource 左下方cookie 查看 cookie作用: 保存:[安全性要 ...
- 随机算法 poj 2576 Tug of War
Tug of War Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 8187 Accepted: 2204 Descri ...