题意是中文的不解释.(http://acm.hdu.edu.cn/showproblem.php?pid=1430)

思路:

           这个题目直接BFS会超时的(我一开始超时了) ,如果考虑双向BFS的话感觉字典序那个地方不好控制,而且双向BFS也很耗时间,其实我们可以打表,只跑一边BFS,以起点

1,2,3,4,5,6,7,8开始,一直遍历所有状态,把答案存在一个map里面,至于是map<int ,string>,

还是map<string ,string>什么的都可以,只要正确hash就行了,看到还有用"康拓公式"哈希的

(个人表示没学过),这样一边广搜之后就会得到一个一12345678为起点到任意状态的答案,

下面是关键,每次会给我们一组数据,初始状态 s 和 末状态 e ,我们要想办法把题目给的数据和我们打表数据联系起来,这样就设计到一个映射关系.

比如:

         测试数据是  S    1  2  3  4    到       4  3  2  1

                                  7  8  6  5               8  6  5  7


        转换成          S    1  2  3  4  到        4  3  2  1

                                   8  7  6  5             7  6  5  8

       其实就是八个数字之间的位置关系,把测试数据的位置关系当规则,把1 2 3 4 5 6 7 8

      按照这个规则转换成相应的终点,然后直接输出打表后的答案就OK了.

ac代码:

#include<stdio.h> 

#include<iostream>

#include<string.h>

#include<string>

#include<queue>

#include<map>

using namespace std;

typedef struct

{

   int now[2][4];

   string road;

}NODE;

map<int ,string>hash;

queue<NODE>q;

NODE xin ,tou;

bool jhs(NODE a)

{

   int temp = 1 ,sum = 0;

   for(int i = 0 ;i < 2 ;i ++)

   for(int j = 0 ;j < 4 ;j ++)

   {

      sum += temp * a.now[i][j];

      temp *= 10;

   }

   if(hash[sum] != "") return 1;

   hash[sum] = a.road;

   return 0;

}

void DB_BFS()

{

   int temp = 0;

   for(int i = 0 ;i < 4 ;i ++)

   xin.now[0][i] = ++ temp;

   for(int i = 3 ;i >= 0 ;i --)

   xin.now[1][i] = ++ temp;

   xin.road = "";

   

   hash.clear();

   jhs(xin);

   

   while(!q.empty())

   q.pop();

   q.push(xin);

   int i ,j;

   while(!q.empty())

   {

      tou = q.front();

      q.pop();

      

      for(i = 0 ;i < 2 ;i ++)

      for(j = 0 ;j < 4 ;j ++)

      {

         if(!i) xin.now[1][j] = tou.now[i][j];

         else   xin.now[0][j] = tou.now[i][j];

      }

      xin.road = tou.road + 'A';

      if(!jhs(xin))

      {

         q.push(xin);

      }

      

      for(i = 0 ;i < 2 ;i ++)

      for(j = 1 ;j < 4 ;j ++)

      xin.now[i][j] = tou.now[i][j-1];

      xin.now[0][0] = tou.now[0][3];

      xin.now[1][0] = tou.now[1][3];

      xin.road = tou.road + 'B';

      

      if(!jhs(xin))

      {

         q.push(xin);

      }

      

      xin = tou;

      xin.now[0][1] = tou.now[1][1];

      xin.now[0][2] = tou.now[0][1];

      xin.now[1][2] = tou.now[0][2];

      xin.now[1][1] = tou.now[1][2];

      xin.road = tou.road + 'C';

      

      if(!jhs(xin))

      {

         q.push(xin);

      }

   }

}

   

int main ()

{

   char str1[20] ,str2[20];

   int i ,j;

   int X[20];

   DB_BFS();

   while(~scanf("%s%s" ,str1 ,str2))

   {

      int temp = 0;

      for(i = 0 ;i < 4 ;i ++)

      X[str1[i] - 48] = ++ temp;

      for(i = 3 ;i >= 0 ;i --)

      X[str1[7 - i] - 48] = ++ temp;

      

      temp = 0;

      int tt = 1 ,sum = 0;

      for(i = 0 ;i < 4 ;i ++)

      {

         sum += X[str2[i] - 48] * tt;

         tt *= 10;

      }

      for(i = 7 ;i >= 4 ;i --)

      {

         sum += X[str2[i] - 48] * tt;

         tt *= 10;

      }

      if(hash[sum] == "AA")

      puts("");

      else

      cout<<hash[sum]<<endl;

   }

   return 0;

}

HDU 1430 关系映射 + 打表 .的更多相关文章

  1. Hibernate多对多关系映射(建表)

    下边讲述Hibernate多对多关系映射. 多对多关系的表的结构为: 两个实体表,还包含一个关系表,关系表为复合主键,如果要使用Hibernate多对多关系映射,则关系表必须只包含两个字段,如果生成了 ...

  2. hibernate(四)__由表逆向创建Domain对象和对象关系映射文件

    之前我们是手写Domain对象和对象关系映射文件->然后生成数据库中的Table. 现在我们反过来先在数据库中建好Table->然后用工具生成Domain对象和对象关系映射文件. 步骤: ...

  3. hibernate课程 初探单表映射1-9 创建关系映射文件

    创建关系映射文件:(把实体类映射成一个表) 1 右键src==>new==>other==>hibernate==>hbm.xml==>Student==>Fini ...

  4. Hibernate表关系映射之多对多映射

    一.多对多的实现原理 在数据库中实现多对多的关系,必须使用连接表.也就是用一个独立的表来存入两个表的主键字段,通过遍历这张表来获取两表的关联关系. 而在我们的对象中,多对多是通过两者对象类中互相建立对 ...

  5. Hibernate表关系映射之一对一映射

    一.数据表的映射关系 在数据库领域中,数据表和数据表之间关系一般可以分为如下几种: 一对一:比如公民和身份证的关系,一个人只有一张身份证,同时每张身份证也仅仅对应一个人! 一对多:比如客户和订单之间的 ...

  6. 在Entity Framework 中实现继承关系映射到数据库表

    继承关系映射到数据库表中有多种方式: 第一种:TPH(table-per-hiaerachy) 每一层次一张表 (只有一张表) 仅使用名为父类的类型名的一张表,它包含了各个子类的所有属性信息,使用区分 ...

  7. Django---静态文件配置,post提交表单的csrf问题(日后细说),创建app子项目和分析其目录,ORM对象关系映射简介,Django操作orm(重点)

    Django---静态文件配置,post提交表单的csrf问题(日后细说),创建app子项目和分析其目录,ORM对象关系映射简介,Django操作orm(重点) 一丶Django的静态文件配置 #we ...

  8. Hibernate初探之单表映射——创建对象-关系映射文件

    编写一个Hibernate例子 第三步:创建对象-关系映射文件 以下是具体实现步骤: 找到我们要持久化的学生类Sudents 生成对象-关系映射文档Students.hbm.xml: <?xml ...

  9. HDU 1430 魔板(康托展开+BFS+预处理)

    魔板 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

随机推荐

  1. mac 下如何轻松安装神器 Anaconda

    本文推荐使用homebrew 安装 1.打开终端执行 brew cask install anaconda3 然后就可以喝一杯咖啡了,终端会自动执行安装好 如果终端卡在update homebrew ...

  2. JavaWeb随笔整理

    JavaWeb随笔整理 为方便阅读,故整理了相关学习笔记 前端相关 HTML CSS JavaScript BootStrap 数据库相关 MySQL基础 MySQL表的约束和数据库设计 MySQL多 ...

  3. Kilo 使用教程

    写了这么多篇 WireGuard 相关的保姆教程,今天终于牵扯到 Kubernetes 了,不然怎么对得起"云原生"这三个字.如果看到这篇文章的你仍然是个 WireGuard 新手 ...

  4. 客官,.NETCore无代码侵入的模型验证了解下

    背景 .NETCore下的模型验证相信绝大部分的.NET开发者或多或少的都用过,微软官方提供的模型验证相关的类位于System.ComponentModel.DataAnnotations命令空间下, ...

  5. python工业互联网应用实战8—django-simpleui

    笔者也使用过一段时间adminx组件,后来由于adminx停更,又遇到更简单的django-simpleui后,现在基本上只使用simpleui了,使用simpleui的几个好处,笔者认为排在第一位的 ...

  6. IPFS挖矿硬盘满了会怎样?

    IPFS是一个互联网协议,对标现在的HTTP.所以,可以想见未来IPFS有多大的价值.所谓IPFS挖矿,是基于IPFS,挖的是filecoin,称其为filecoin挖矿倒是更为贴切.许多初接触IPF ...

  7. JVM之对象创建、对象内存布局、对象访问定位

    对象创建 类加载过后可以直接确定一个对象的大小 对象栈上分配是通过逃逸分析判定.标量替换实现的,即把不存在逃逸的对象拆散,将成员变量恢复到基本类型,直接在栈上创建若干个成员变量 选择哪种分配方式由Ja ...

  8. [Design Pattern With Go]设计模式-工厂模式

    这次介绍的设计模式是工厂模式,这是一个比较常见的创建型模式.一般情况下,工厂模式分为三种:简单工厂.工厂方法和抽象工厂,下面慢慢举例介绍下. 简单工厂 考虑一个加密程序的应用场景,一个加密程序可能提供 ...

  9. 【linux】驱动-5-驱动框架分层分离&实战

    目录 前言 5. 分离分层 5.1 回顾-设备驱动实现 5.2 分离分层 5.3 设备 5.4 驱动 5.5 系统,模块 5.6 Makefile 参考: 前言 5. 分离分层 本章节记录实现LED驱 ...

  10. 力扣 - 560. 和为K的子数组

    目录 题目 思路1(前缀和) 代码 复杂度分析 思路2(前缀和+哈希表优化) 代码 复杂度分析 题目 560. 和为K的子数组 思路1(前缀和) 构建前缀和数组,可以快速计算任意区间的和 注意:计算区 ...