hdu 1430+hdu 3567(预处理)
题目链接: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(预处理)的更多相关文章
- HDU 1430 魔板(康托展开+BFS+预处理)
魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- hdu 5317 合数分解+预处理
RGCDQ Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- HDU - 2222,HDU - 2896,HDU - 3065,ZOJ - 3430 AC自动机求文本串和模式串信息(模板题)
最近正在学AC自动机,按照惯例需要刷一套kuangbin的AC自动机专题巩固 在网上看过很多模板,感觉kuangbin大神的模板最为简洁,于是就选择了用kuangbin大神的模板. AC自动机其实就是 ...
- POJ-1077 HDU 1043 HDU 3567 Eight (BFS预处理+康拓展开)
思路: 这三个题是一个比一个令人纠结呀. POJ-1077 爆搜可以过,94ms,注意不能用map就是了. #include<iostream> #include<stack> ...
- hdu 1430 魔板 (BFS+预处理)
Problem - 1430 跟八数码相似的一题搜索题.做法可以是双向BFS或者预处理从"12345678"开始可以到达的所有状态,然后等价转换过去直接回溯路径即可. 代码如下: ...
- HDU - 1430 魔板 (bfs预处理 + 康托)
对于该题可以直接预处理初始状态[0, 1, 2, 3, 4, 5, 6, 7]所有可以到达的状态,保存到达的路径,直接打印答案即可. 关于此处的状态转换:假设有初始状态为2,3,4,5,0,6,7,1 ...
- HDU - 1430 魔板 【BFS + 康托展开 + 哈希】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1430 思路 我刚开始 想到的 就是 康托展开 但是这个题目是 多组输入 即使用 康托展开 也是会T的 ...
- hdu 1430 魔板 康托展开 + 很好的映射
http://acm.hdu.edu.cn/showproblem.php?pid=1430 如果从start ---> end,每一次都bfs进行,那么就肯定会超时. 考虑到先把start映射 ...
- hdu 1430 (BFS 康托展开 或 map )
第一眼看到这题就直接BFS爆搜,第一发爆了内存,傻逼了忘标记了,然后就改,咋标记呢. 然后想到用map函数,就8!个不同的排列,换成字符串用map标记.然后又交一发果断超时,伤心,最恨超时,还不如来个 ...
随机推荐
- sql server case when 判断为空
代码如下 select distinct G.* ,(select BUSINESS_NAME from BusinessInfo where BusinessInfo.BUSINESS_BID=G. ...
- JQuery元素获取
前言:这是本类别博文JQuery即用即查开篇. 因为查手册太麻烦,而且有时候需要深入命令所在详细页面才能了解此命令的具体作用是什么. 写这几篇文章就是为了,工作遇到问题时,一看这几篇文章就可以查到哪个 ...
- JVM是如何分配和回收内存?有实例!
上一篇博客我简单介绍了下如何手动计算一个Java对象到底占用多少内存?今天就想聊下这个内存JVM到底是是如何分配和回收的. Java整体来说还是一个GC比较友好的语言,无论是分代的垃圾收集,还是基于G ...
- ruby实时查看日志
(文章是从我的个人主页上粘贴过来的, 大家也可以访问我的主页 www.iwangzheng.com) 在调试代码的时候,把日志文件打开,边操作边调试能很快帮助我们发现系统中存在的问题. $tail r ...
- HDOJ 1203 I NEED A OFFER!(01背包)
10397507 2014-03-25 23:30:21 Accepted 1203 0MS 480K 428 B C++ 泽泽 题目链接:http://acm.hdu.edu.cn/showprob ...
- Cannot locate factory for objects of type DefaultGradleConnector, as ConnectorServiceRegistry has been closed.
现象:更换android studio libs文件夹下的jar包,重新编译代码报错:Cannot locate factory for objects of type DefaultGradleCo ...
- 能用Shell就别编程-海量文本型数据的处理
对于txt文本类数据,优先采用shell脚本,实在不行才用Python,Java,MySQL 1) Shell命令行或脚本的处理速度极快,比Java快得多. 2) Shell代码量少,几个命令就能完成 ...
- sort如何按指定的列排序
<1>[root@localhost company]# cat test 06d7 145 4192542506e1 ...
- codeforces A. Table 解题报告
题目链接:http://codeforces.com/problemset/problem/359/A 题目意思:给出一个n行m列的table,你需要选择一个good cell(假设为(x, y), ...
- codeforces B. Eight Point Sets 解题报告
题目链接:http://codeforces.com/problemset/problem/334/B 一开始看到题目,有点怯,理解了题目后,其实并不难.这句话是突破口 three distinct ...