洛谷 - P2578 - 九数码游戏 - bfs】的更多相关文章

https://www.luogu.org/problemnew/show/P2578 一个挺搞的东西,用康托展开做记忆化搜索可以少一个log的查询. #include <bits/stdc++.h> using namespace std; #define ll long long , , , , , , , , , ,}; // 阶乘 //康托展开 int cantor(int *a,int n) { ; ; i<n; i++) { ; ,m=;//c记录后面的阶乘 ; j<n…
Solution 这题的话直接上BFS就可以了,因为要输出方案,所以我们要开一个pre数组记录前驱,最后输出就可以了. 对于状态的记录,一般都用哈希来存,但因为这道题比较特殊,它是一个排列,所以我们可以利用康拓展开把空间压到9!. 康拓展开 一个排列的康拓展开表示的是字典序比他小的排列的个数,所以我们统计一下每一位后面有几个比它小的数字,乘上(n-i)! inline int zx_hash(int x){ ;i>=;--i)a[i]=x%,x/=; ; ;i<=;++i){ ; ;j<…
https://www.luogu.org/problemnew/show/P1379 #include <bits/stdc++.h> using namespace std; #define ll long long , , , , , , , , , ,}; // 阶乘 //康托展开 int cantor(int *a,int n) { ; ;i<n;i++) { ;,m=;//c记录后面的阶乘 ;j<n;j++) { if(a[j]<a[i])x++; m*=c;c+…
神奇bug,没有记录pre就show了,找了1个小时. #include <bits/stdc++.h> using namespace std; #define ll long long ; int encode(int *a) { ; ;i<; i++) { if(a[i]) res|=; res<<=; } ; } void decode(int code,int *a) { ; i>=; i--) { a[i]=code&; code>>=;…
问题描述 LG2578 题解 用string+map去重. bfs即可. \(\mathrm{Code}\) #include<bits/stdc++.h> using namespace std; void read(int &x){ x=0;char ch=1;int fh; while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar(); if(ch=='-') ch=getchar(),fh=-1; else fh=1;…
https://www.luogu.org/problemnew/show/P1778 https://www.luogu.org/problemnew/show/P2578 双向广搜. 有固定起点终点,过程可逆. 有时用于A*估价函数不好用的时候. 万圣节后的早晨 (由于鬼可以同时移动,估价函数不好设计) 优化: 1.预处理. 预处理每个可以到的位置的上下左右的块能否到达,建一个类似前向星的数组. 就可以很快地查询了. 2.每次枚举前1/2个鬼就可以判定当前的状态是否合法,可以减掉不少. 尽可…
[ZJOI2005]九数码游戏 题目描述 输入输出格式 输入格式: 输入文件中包含三行三列九个数,同行的相邻两数用空格隔开,表示初始状态每个方格上的数字.初始状态不会是目标状态. 输出格式: 如果目标状态无法达到,则输出"UNSOLVABLE"(引号不输出). 否则,第一行是一个整数S,表示最少的操作次数.接下来4 × (S + 1)行,每四行表示一个状态:前三行每行三个整数,相邻两数用空格隔开,表示每个方格上的数字,第四行是一个空行,作为分隔.第一个状态必须是初始状态,最后一个状态必…
洛谷1118 数字三角形游戏 题目描述 有这么一个游戏: 写出一个1-N的排列a[i],然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少1,直到只剩下一个数字位置.下面是一个例子:     3   1   2   4       4   3   6         7   9          16 最后得到16这样一个数字. 现在想要倒着玩这样一个游戏,如果知道N,知道最后得到的数字的大小sum,请你求出最初序列a[i],为1-N的一个…
Problem 洛谷P1274-魔术数字游戏 Accept: 118    Submit: 243Time Limit: 1000 mSec    Memory Limit : 128MB Problem Description 填数字方格的游戏有很多种变化,如下图所示的4×4方格中,我们要选择从数字1到16来填满这十六个格子(Aij,其中i=1..4,j=1..4).为了让游戏更有挑战性,我们要求下列六项中的每一项所指定的四个格子,其数字累加的和必须为34: 四个角落上的数字,即A11+A14…
洛谷P1288 取数游戏II 先手必胜的条件需要满足如下中至少 \(1\) 条: 从初始位置向左走到第一个 \(0\) 的位置,经过边的数目为偶数(包含 \(0\) 这条边). 从初始位置向右走到第一个 \(0\) 的位置,经过边的数目为偶数(包含 \(0\) 这条边). 否则先手必败. #include<stdio.h> #include<string.h> using namespace std; const int maxn = 25; int a[maxn], n, ans…