loj 1165(bfs+康托展开)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26879
思路:题目意思很简单,就是通过一些位置的交换,最后变成有序数列,对于一组序列,我们可以用康托展开然后hash判重。
然后就是普通的bfs,稍微留意一下细节即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int is_prime[]={,,,,,,,,,,,,,,,,,};
int fac[]={,,,,,,,,}; struct Point{
int num,flag;
}; struct Node{
Point state[];
int step;
}st; bool mark[]; int Get_Hash(Node &node)
{
int a[],val=,cnt;
for(int i=;i<;i++)a[i]=abs(node.state[i].num);
for(int i=;i<;i++){
cnt=;
for(int j=;j<i;j++){
if(a[j]>a[i])cnt++;
}
val+=cnt*fac[i];
}
return val;
} bool Judge(Node &node)
{
for(int i=;i<;i++){
if(abs(node.state[i].num)>abs(node.state[i+].num))
return false;
}
return true;
} Node Get_Node(Node &p,int pos1,int pos2,int dir)
{
//pos1->pos2 left
if(dir==){
if(pos1<pos2){
int tmp=p.state[pos1].num,flag=p.state[pos1].flag;
for(int i=pos1;i<=pos2-;i++){
p.state[i].num=p.state[i+].num;
p.state[i].flag=p.state[i+].flag;
}
p.state[pos2-].num=tmp;
p.state[pos2-].flag=flag;
}else {
int tmp=p.state[pos1].num,flag=p.state[pos1].flag;
for(int i=pos1;i>pos2;i--){
p.state[i].num=p.state[i-].num;
p.state[i].flag=p.state[i-].flag;
}
p.state[pos2].num=tmp,p.state[pos2].flag=flag;
}
}else if(dir==){ //pos1->pos2 right
if(pos1<pos2){
int tmp=p.state[pos1].num,flag=p.state[pos1].flag;
for(int i=pos1;i<=pos2-;i++){
p.state[i].num=p.state[i+].num;
p.state[i].flag=p.state[i+].flag;
}
p.state[pos2].num=tmp,p.state[pos2].flag=flag;
}else {
int tmp=p.state[pos1].num,flag=p.state[pos1].flag;
for(int i=pos1;i>=pos2+;i--){
p.state[i].num=p.state[i-].num;
p.state[i].flag=p.state[i-].flag;
}
p.state[pos2+].num=tmp,p.state[pos2+].flag=flag;
}
}
return p;
} void bfs()
{
memset(mark,false,sizeof(mark));
queue<Node>que;
que.push(st);
mark[Get_Hash(st)]=true;
while(!que.empty()){
Node q,pp,p=que.front();
que.pop();
if(Judge(p)){
printf("%d\n",p.step);
return ;
}
for(int i=;i<;i++){
for(int j=;j<;j++)if(i!=j){
if(p.state[i].flag!=p.state[j].flag&&is_prime[abs(p.state[i].num)+abs(p.state[j].num)]){
for(int k=;k<;k++){
pp=p;
q=Get_Node(pp,i,j,k);
int val=Get_Hash(q);
q.step=p.step+;
if(!mark[val]){
mark[val]=true;
que.push(q);
}
}
}
}
}
}
puts("-1");
} int main()
{
int _case,t=;
scanf("%d",&_case);
while(_case--){
for(int i=;i<;i++){
scanf("%d",&st.state[i].num);
st.state[i].flag=(st.state[i].num>?:-);
}
st.step=;
printf("Case %d: ",t++);
bfs();
}
return ;
}
loj 1165(bfs+康托展开)的更多相关文章
- HDU_1043 Eight 【逆向BFS + 康托展开 】【A* + 康托展开 】
一.题目 http://acm.hdu.edu.cn/showproblem.php?pid=1043 二.两种方法 该题很明显,是一个八数码的问题,就是9宫格,里面有一个空格,外加1~8的数字,任意 ...
- hdu1430魔板(BFS+康托展开)
做这题先看:http://blog.csdn.net/u010372095/article/details/9904497 Problem Description 在魔方风靡全球之后不久,Rubik先 ...
- Aizu0121 Seven Puzzle(bfs+康托展开)
https://vjudge.net/problem/Aizu-0121 比八数码要水的多,bfs. 但是做的时候我把康托展开记错了,wa了好几次. 附上康托展开博客详解:https://blog.c ...
- 蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)
Description 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的 ...
- HDU 1043 Eight(双向BFS+康托展开)
http://acm.hdu.edu.cn/showproblem.php?pid=1043 题意:给出一个八数码,求出到达指定状态的路径. 思路:路径寻找问题.在这道题里用到的知识点挺多的.第一次用 ...
- hdu 1430(BFS+康托展开+映射+输出路径)
魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- HDU_1430 魔板 【BFS+康托展开+置换】
一.题面 POJ1430 二.分析 该题与之前做的八数码不同,它是一个2*4的棋盘,并且没有空的区域.这样考虑的情况是很少的,依然结合康托展开,这时康托展开最多也只乘7的阶乘,完全可以BFS先预处理一 ...
- HDU - 1430 魔板 【BFS + 康托展开 + 哈希】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1430 思路 我刚开始 想到的 就是 康托展开 但是这个题目是 多组输入 即使用 康托展开 也是会T的 ...
- hdu 5012 bfs 康托展开
Dice Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submi ...
随机推荐
- hibernate criteria中Restrictions的用法
方法说明 方法 说明 Restrictions.eq = Restrictions.allEq 利用Map来进行多个等于的限制 Restrictions.gt > Restrictions.ge ...
- 优化sql语句
关于数据库sql语句的优化? 这个链接可以看 涉及数据库的操作基本都是变得很慢了, 所以通常说数据库是程序的瓶颈 测试/优化数据库/sql的方法: 把order排序.where条件等一个一个去除法来做 ...
- vim设置语法高亮
在vim安装目录中的_vimrc修改,加上以下的代码. set nu! colorscheme desert syntax enable syntax on
- Entity Framework Fluent API
前言 使用DataAnnotation非常简单,但对于EntityFramework中的特性,就要在实体类中引入EntityFramework程序集,但实体类最好能是保持与架构无关性的POCO类,才能 ...
- Lua中的捕获
Lua中的捕获 捕获 捕获是这样一种机制:可以使用模式串的一部分匹配目标串的一部分.将你想捕获的模式用圆括号括起来,就指定了一个捕获.在string.find使用捕获的时候,函数会返回捕获的值作为 ...
- centos安装配置nginx
1.安装gcc yum install gcc 2.安装PCRE,zlib,OpenSSL(其中devel,是develop开发包的意思) yum install -y pcre pcre-devel ...
- SGU 179 Brackets light(生成字典序的下一个序列)
题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=179 解题报告:输入一个合法的括号串,求出这个括号串的字典序的下一个串.(认为'(' ...
- Class Methods & Variables
When calling an instance method like withdraw_securely, the syntax generally looks something like th ...
- hiho #1288 微软2016.4校招笔试题 Font Size
#1288 : Font Size 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Steven loves reading book on his phone. The ...
- Centos镜像使用帮助
https://lug.ustc.edu.cn/wiki/mirrors/help/centos