题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1430

思路:由于只是8种颜色,所以标号就无所谓了,对起始状态重新修改标号为 12345678,对目标状态标号做相应的修改,先预处理出12345678到所有状态的路径,记录所有状态的pre值,直接输出即可。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<string>
using namespace std; struct Node{
char str[];
Node(){};
Node(char _str[]){
for(int i=;i<;i++){
str[i]=_str[i];
}
}
}; int fac[]={,,,,,,,,};
int Get_Hash(Node &p)
{
int val=;
for(int i=;i<;i++){
int cnt=;
for(int j=;j<i;j++){
if(p.str[j]>p.str[i])cnt++;
}
val+=cnt*fac[i];
}
return val;
} void Move_A(Node &p)
{
reverse(p.str,p.str+);
} void Move_B(Node &p)
{
char ch=p.str[];
for(int i=;i>=;i--)p.str[i]=p.str[i-];
p.str[]=ch;
ch=p.str[];
for(int i=;i<=;i++)p.str[i]=p.str[i+];
p.str[]=ch;
} void Move_C(Node &p)
{
swap(p.str[],p.str[]);
swap(p.str[],p.str[]);
swap(p.str[],p.str[]);
} int pre[],ans[];
bool mark[]; void BFS()
{
queue<Node>que;
que.push(Node(""));
memset(mark,false,sizeof(mark));
mark[]=true;
while(!que.empty()){
Node p=que.front();
que.pop();
int p_val=Get_Hash(p);
Node q(p);
Move_A(q);
int q_val=Get_Hash(q);
if(!mark[q_val]){
mark[q_val]=true;
pre[q_val]=p_val;
ans[q_val]='A';
que.push(q);
}
q=p;
Move_B(q);
q_val=Get_Hash(q);
if(!mark[q_val]){
mark[q_val]=true;
pre[q_val]=p_val;
ans[q_val]='B';
que.push(q);
}
q=p;
Move_C(q);
q_val=Get_Hash(q);
if(!mark[q_val]){
mark[q_val]=true;
pre[q_val]=p_val;
ans[q_val]='C';
que.push(q);
}
}
} char S[],T[];
int SS[];
int main()
{
BFS();
while(~scanf("%s%s",S,T)){
for(int i=;i<;i++)SS[S[i]-'']=i;
for(int i=;i<;i++)T[i]=SS[T[i]-'']+'';
Node p=Node(T);
int val=Get_Hash(p);
string ss="";
while(val){
ss+=ans[val];
val=pre[val];
}
reverse(ss.begin(),ss.end());
cout<<ss<<endl;
}
return ;
}

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3567

思路:因为这题有一个特殊的点X,所以枚举X的位置,打出9张前驱表,用魔板题一样的方法将两个状态的对应标号转化,输出就好了。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
using namespace std; struct Node{
int map[][];
int x,y;
Node(){}
Node(char *str){
for(int i=,xx=,yy=;str[i];i++){
map[xx][yy]=str[i];
if(str[i]=='X'){ x=xx,y=yy; }
yy++;
if(yy==)xx++,yy=;
}
}
}S; int fac[]= {,,,,,,,,};
//康拓展开
int Get_Hash(Node &p)
{
char str[];
int val=;
for(int i=;i<;i++){
for(int j=;j<;j++){
str[i*+j]=p.map[i][j];
int cnt=;
for(int k=i*+j-;k>=;k--){
if(str[k]>str[i*+j])cnt++;
}
val+=fac[i*+j]*cnt;
}
}
return val;
} int dir[][]={{,},{,-},{,},{-,}};
char Dir[]="dlru";
int pre[][];
char ans[][];
bool mark[]; void bfs(int x)
{
memset(pre[x],-,sizeof(pre[x]));
memset(mark,false,sizeof(mark));
queue<Node>que;
que.push(S);
mark[Get_Hash(S)]=true;
while(!que.empty()){
Node p=que.front();
que.pop();
int p_val=Get_Hash(p);
for(int i=;i<;i++){
Node q=p;
q.x=p.x+dir[i][],q.y=p.y+dir[i][];
if(q.x<||q.x>=||q.y<||q.y>=)continue;
q.map[p.x][p.y]=q.map[q.x][q.y];
q.map[q.x][q.y]='X';
int q_val=Get_Hash(q);
if(mark[q_val])continue;
mark[q_val]=true;
pre[x][q_val]=p_val;
ans[x][q_val]=Dir[i];
que.push(q);
}
}
} char str[];
int num[];
int main()
{
S=Node("X12345678");
bfs();
S=Node("1X2345678");
bfs();
S=Node("12X345678");
bfs();
S=Node("123X45678");
bfs();
S=Node("1234X5678");
bfs();
S=Node("12345X678");
bfs();
S=Node("123456X78");
bfs();
S=Node("1234567X8");
bfs();
S=Node("12345678X");
bfs(); int _case,p,t=;
scanf("%d",&_case);
while(_case --){
scanf("%s", str);
for(int i = , j = ; i <= ; i ++ ){
if(str[i] != 'X') num[str[i] - ''] = j ++;
else p = i;
}
scanf("%s", str);
for(int i=;i<=;i++){
if(str[i]=='X')continue;
str[i]=num[str[i]-'']+'';
}
S=Node(str);
int val=Get_Hash(S);
string ss="";
while(val!=-){
ss+=ans[p][val];
val=pre[p][val];
}
reverse(ss.begin(), ss.end());
printf("Case %d: %d\n",t++,ss.size()-);
for(int i=;i<ss.size();i++)cout<<ss[i];
cout<<endl;
}
return ;
}

hdu 1430+hdu 3567(预处理)的更多相关文章

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

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

  2. hdu 5317 合数分解+预处理

    RGCDQ Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  3. HDU - 2222,HDU - 2896,HDU - 3065,ZOJ - 3430 AC自动机求文本串和模式串信息(模板题)

    最近正在学AC自动机,按照惯例需要刷一套kuangbin的AC自动机专题巩固 在网上看过很多模板,感觉kuangbin大神的模板最为简洁,于是就选择了用kuangbin大神的模板. AC自动机其实就是 ...

  4. POJ-1077 HDU 1043 HDU 3567 Eight (BFS预处理+康拓展开)

    思路: 这三个题是一个比一个令人纠结呀. POJ-1077 爆搜可以过,94ms,注意不能用map就是了. #include<iostream> #include<stack> ...

  5. hdu 1430 魔板 (BFS+预处理)

    Problem - 1430 跟八数码相似的一题搜索题.做法可以是双向BFS或者预处理从"12345678"开始可以到达的所有状态,然后等价转换过去直接回溯路径即可. 代码如下: ...

  6. HDU - 1430 魔板 (bfs预处理 + 康托)

    对于该题可以直接预处理初始状态[0, 1, 2, 3, 4, 5, 6, 7]所有可以到达的状态,保存到达的路径,直接打印答案即可. 关于此处的状态转换:假设有初始状态为2,3,4,5,0,6,7,1 ...

  7. HDU - 1430 魔板 【BFS + 康托展开 + 哈希】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1430 思路 我刚开始 想到的 就是 康托展开 但是这个题目是 多组输入 即使用 康托展开 也是会T的 ...

  8. hdu 1430 魔板 康托展开 + 很好的映射

    http://acm.hdu.edu.cn/showproblem.php?pid=1430 如果从start ---> end,每一次都bfs进行,那么就肯定会超时. 考虑到先把start映射 ...

  9. hdu 1430 (BFS 康托展开 或 map )

    第一眼看到这题就直接BFS爆搜,第一发爆了内存,傻逼了忘标记了,然后就改,咋标记呢. 然后想到用map函数,就8!个不同的排列,换成字符串用map标记.然后又交一发果断超时,伤心,最恨超时,还不如来个 ...

随机推荐

  1. 利用ps橡皮擦工具快速抠图

    原图 最终效果 1.打开图片,ctrl+j得到图层1,点击红圈处,创建图层2,放于图层1与背景层之间,填充白色作为检查效果和新的背景. 2.按图示给出的参数,用背景橡皮擦在图层1里擦吧,注意擦的时候尽 ...

  2. C++_Eigen函数库用法笔记——Advanced Initialization

    The comma initializer a simple example  join and block initialize  join two row vectors together ini ...

  3. iOS多线程介绍

    一.线程概述 有些程序是一条直线,起点到终点:有些程序是一个圆,不断循环,直到将它切断.直线的如简单的Hello World,运行打印完,它的生命周期便结束了,像昙花一现那样:圆如操作系统,一直运行直 ...

  4. 关于31天App教程示例中一些因SDK版本而出现的问题(转)

    由于国外那个知名的31天案例教程比较老,所用官方API是2008年时的2.X,所以在现在的Xcode3-4之后或多或少都有编译警告和错误信息.必须做些适应iOS版本的代码更改才能顺利编译通过. Day ...

  5. zstu.4189: 逻辑运算(构建 && 前缀表达式入门)

    4189: 逻辑运算 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 274  Solved: 42 Description 还记得大学里学过的模电么, ...

  6. Spring常用的接口和类(一)

    一.ApplicationContextAware接口 当一个类需要获取ApplicationContext实例时,可以让该类实现ApplicationContextAware接口.代码展示如下: p ...

  7. RecContentType有哪些

    HTML  页面text/javascript  `type="text/javascript"` 是比较老的写法IETF 推荐的是 `type="application ...

  8. HNU 12845 Ballot Analyzing Device

    题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=12845&courseid=270 解题报告:有m个认给 ...

  9. NGUI例子Scroll View场景中item添加点击后自动滑到终点

    http://blog.csdn.net/luyuncsd123/article/details/22914497 最近在做一个项目的UI,需求是1.拖动items后当永远有一个item保存在中间位置 ...

  10. SSHPASS支持从命令行输入密码

    参考:http://www.2cto.com/os/201307/227911.html 手动下载地址:http://sourceforge.net/projects/sshpass/ 安装示例: w ...