http://www.bnuoj.com/bnuoj/problem_show.php?pid=1071

【题意】:经过四个点的顺逆时针旋转,得到最终拼图

【题解】:康拓展开+BFS,注意先预处理,得到所有状态,然后用hash来调用存在的状态

【code】:

 #include <iostream>
#include <stdio.h>
#include <queue>
#include <string.h> using namespace std;
#define N 363000 struct Nod
{
int b[];
int pos;
}nd1,nd2; int fac[] = {,,,,,,,,,}; //康拓展开用到的数组
//康托展开:
int cantor(int* a, int k)
{
int i, j, tmp, num = ;
for (i = ; i < k; i++) {
tmp = ;
for (j = i + ; j < k; j++)
if (a[j] < a[i])
tmp++;
num += fac[k - i - ] * tmp;
}
return num;
} int mark[N],pre[N];
char dir[N];
int cx[]={,,,};
int cy[]={,,,}; void exchange(int *a,int x,int y,int n) //旋转
{
int temp;
if(n%)
{
temp = a[*x+y];
a[*x+y] = a[*x+y+];
a[*x+y+] = a[*(x+)+y+];
a[*(x+)+y+] = a[*(x+)+y];
a[*(x+)+y] = temp;
}
else
{
temp = a[*(x+)+y];
a[*(x+)+y] = a[*(x+)+y+];
a[*(x+)+y+] = a[*x+y+];
a[*x+y+] = a[*x+y];
a[*x+y] = temp;
}
} void bfs(int *b) //广度优先搜索
{
queue<Nod> q;
memset(mark,,sizeof(mark));
memset(pre,,sizeof(pre));
memcpy(nd1.b,b,sizeof(int)*);
int i,temp;
temp = cantor(b,);
mark[temp] = ;
nd1.pos = temp;
q.push(nd1);
while(!q.empty())
{
nd2 = q.front();
q.pop();
for(i=;i<;i++)
{
memcpy(nd1.b,nd2.b,sizeof(int)*);
exchange(nd1.b,cx[i/],cy[i/],i);
temp = cantor(nd1.b,);
if(mark[temp]!=)
{
mark[temp] = ;
pre[temp] = pre[nd2.pos]+;
nd1.pos = temp;
q.push(nd1);
}
}
}
} int main()
{
char str[];
int a[],b[]={,,,,,,,,},c[],hash[];
bfs(b);
int t;
scanf("%d",&t);
while(t--)
{
int i;
for(i=;i<;i++)
{
scanf("%d",a+i);
hash[a[i]] = i+; //hash
}
for(i=;i<;i++)
{
scanf("%d",c+i);
c[i] = hash[c[i]];
}
int temp = cantor(c,);
printf("Number Of Move(s) Needed: %d\n",pre[temp]);
}
return ;
}

bnuoj 1071 拼图++(BFS+康拓展开)的更多相关文章

  1. Eight (HDU - 1043|POJ - 1077)(A* | 双向bfs+康拓展开)

    The 15-puzzle has been around for over 100 years; even if you don't know it by that name, you've see ...

  2. hdu 1043 pku poj 1077 Eight (BFS + 康拓展开)

    http://acm.hdu.edu.cn/showproblem.php?pid=1043 http://poj.org/problem?id=1077 Eight Time Limit: 1000 ...

  3. 九宫重拍(bfs + 康拓展开)

    问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为:12 ...

  4. 8数码,欺我太甚!<bfs+康拓展开>

    不多述,直接上代码,至于康拓展开,以前的文章里有 #include<iostream> #include<cstdio> #include<queue> using ...

  5. hdu-1043 bfs+康拓展开hash

    因为是计算还原成一种局面的最短步骤,应该想到从最终局面开始做bfs,把所有能到达的情况遍历一遍,把值存下来. bfs过程中,访问过的局面的记录是此题的关键,9*9的方格在计算过程中直接存储非常占内存. ...

  6. HDU 4531 bfs/康拓展开

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4531 吉哥系列故事——乾坤大挪移 Time Limit: 2000/1000 MS (Java/Othe ...

  7. cdoj 414 八数码 (双向bfs+康拓展开,A*)

    一道关乎人生完整的问题. DBFS的优越:避免了结点膨胀太多. 假设一个状态结点可以扩展m个子结点,为了简单起见,假设每个结点的扩展都是相互独立的. 分析:起始状态结点数为1,每加深一层,结点数An ...

  8. ACM/ICPC 之 BFS(离线)+康拓展开(TSH OJ-玩具(Toy))

    祝大家新年快乐,相信在新的一年里一定有我们自己的梦! 这是一个简化的魔板问题,只需输出步骤即可. 玩具(Toy) 描述 ZC神最擅长逻辑推理,一日,他给大家讲述起自己儿时的数字玩具. 该玩具酷似魔方, ...

  9. ACM/ICPC 之 BFS(离线)+康拓展开 (HDU1430-魔板)

    魔板问题,一道经典的康拓展开+BFS问题,为了实现方便,我用string类来表示字符串,此前很少用string类(因为不够高效,而且相对来说我对char数组的相关函数比较熟),所以在这里也发现了很多容 ...

随机推荐

  1. poj 3207 2-SAT问题

    思路:将线段按开始点的升序排序,对线段尾节点进行判断,若存在交叉,那么这两条线段就不能同时在内或同时在外.这样将每条线段在内和在外看成两个状态i和i',i表示线段在内,i'表示线段在外.假使线段i和线 ...

  2. 关闭 Flash 沙箱安全模式,解决浏览器高占用

    经常碰到 Firefox 因 Flash 插件崩溃,到卡饭翻了翻,发现是 Flash 沙箱的问题.原文附带了去沙箱保护的 Flash 插件,可惜版本有点旧,遂自己动手解决. 注意:办法一适用于 [ 安 ...

  3. Java Concurrency - Fork/Join Framework

    Normally, when you implement a simple, concurrent Java application, you implement some Runnable obje ...

  4. VS2012生成不依赖运行时不依赖MFC的MFC程序

    转载请注明来源:http://www.cnblogs.com/xuesongshu/ 1.新建MFC或者Win32工程,全部使用默认设置 2.设置工程属性,展开配置属性,转到:常规~MFC的使用,修改 ...

  5. JAVA.IO流学习笔记

    一.java.io 的描述 通过数据流.序列化和文件系统提供系统输入和输出.IO流用来处理设备之间的数据传输 二.流 流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数 ...

  6. C#判断Textbox是否为数字

    第一种方法: try { ) { //操作代码 } else { MessageBox.Show("必须是正整数"); } } catch (FormatException) { ...

  7. SQL通过日期计算年龄

    首先建立一个表如下: ======================= BirthDay datetime not null Age 通过公式计算得出 ======================= 以 ...

  8. C#中委托和事件的区别实例解析

    这篇文章主要介绍了C#中委托和事件的区别,并分别以实例形式展示了通过委托执行方法与通过事件执行方法,以及相关的执行流程与原理分析,需要的朋友可以参考下 本文实例分析了C#中委托和事件的区别,分享给大家 ...

  9. java新手笔记30 集合

    1.set/list package com.yfs.javase; import java.util.ArrayList; import java.util.Collection; import j ...

  10. Adapter模式

    Adapter模式主要用于将一个类的接口转换为另外一个接口,通常情况下再不改变原有体系的条件下应对新的需求变化,通过引入新的适配器类来完成对既存体系的扩展和改造.实现方式主要包括: 1.类的Adapt ...