ACM-康托展开+预处理BFS之魔板——hdu1430
魔板
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1679 Accepted Submission(s): 354
1 2 3 4
8 7 6 5
对于魔板,可施加三种不同的操作,详细操作方法例如以下:
A: 上下两行互换,如上图可变换为状态87654321
B: 每行同一时候循环右移一格,如上图可变换为41236785
C: 中间4个方块顺时针旋转一格,如上图可变换为17245368
给你魔板的初始状态与目标状态,请给出由初态到目态变换数最少的变换步骤,若有多种变换方案则取字典序最小的那种。
12345678
17245368
12345678
82754631
C
AC
for( i=0;i<8;i++)pos[s1[i]-'0']=i+1+'0';for( i=0;i<8;i++)s2[i]=pos[s2[i]-'0‘];k=kangtuo(s2);
上面一段代码的意思是:把起始目标看成了1,2,3,4,5,6,7,8 ;
列如:位置:12345678 12345678
起初: 63728145 变 12345678
终点: 86372541 成 51234876
解释一下:初:6在第1个位,那么在终点中找6用1取代,3在第2个位,在终点中找3用2取代,依次类推。
一開始我们就先按 12345678 这种顺序建立了一棵像树一样的,假设直接从初态不进行转变的话,那么我们的结果可能有非常多的走法,有可能是先走A或B都能够到目标,有多条路时,可是先走了B的路径,必需要输出小的也就是从A開始的那条路,那怎么办呢,就能够用转化的思想了,把初始状态变成12345678,这种话,我们一開始就是从这种顺序算出来的!!所以必须先进行转换,在从目标往上找并记下路径,一直找到终于父节点:12345678.
/**************************************
***************************************
* Author:Tree *
*From :http://blog.csdn.net/lttree *
* Title : 魔板 *
*Source: hdu 1430 *
* Hint : 康托展开 BFS *
***************************************
**************************************/
#include <iostream>
#include <string.h>
#include <string>
#include <queue>
using namespace std;
struct Node
{
string str,step;
};
bool vis[40320+1];
int pos[10],fac[] = {1,1,2,6,24,120,720,5040,40320};
// ans存从起点到达该点的答案
string ans[50000];
// 康托展开
int kangtuo(string a)
{
int i,j,t,sum;
sum=0;
for( i=0; i<8 ;++i)
{
t=0;
for(j=i+1;j<8;++j)
if( a[i]>a[j] )
++t;
sum+=t*fac[8-i-1];
}
return sum+1;
}
// 按A进行变换
void move_A(string &s)
{
for(int i=0;i<4;++i)
swap(s[i],s[i+4]);
}
// 按B进行变换
string move_B(string s)
{
string temp=s;
int i;
for(i=0;i<8;++i)
{
if( i==0 || i==4 ) temp[i]=s[i+3];
else temp[i]=s[i-1];
}
return temp;
}
// 按C进行变换
void move_C(string &s)
{
swap(s[1],s[2]);
swap(s[5],s[6]);
swap(s[1],s[6]);
}
void bfs( string s )
{
memset(vis,0,sizeof(vis));
queue <Node> q;
Node pre,lst; pre.str=s;
pre.step="";
vis[kangtuo(s)]=1;
ans[kangtuo(s)]=pre.step;
q.push( pre ); while( !q.empty() )
{
pre=q.front();
q.pop(); lst=pre;
move_A(lst.str);
if( !vis[kangtuo(lst.str)] )
{
lst.step+="A";
vis[kangtuo(lst.str)]=1;
ans[kangtuo(lst.str)]=lst.step;
q.push(lst);
} lst.str=move_B(pre.str);
if( !vis[kangtuo(lst.str)] )
{
lst.step=pre.step+"B";
vis[kangtuo(lst.str)]=1;
ans[kangtuo(lst.str)]=lst.step;
q.push(lst);
} lst=pre;
move_C(lst.str);
if( !vis[kangtuo(lst.str)] )
{
lst.step+="C";
vis[kangtuo(lst.str)]=1;
ans[kangtuo(lst.str)]=lst.step;
q.push(lst);
}
} }
int main()
{
int i,k;
string s1,s2;
// 预处理,从起点到各点。
bfs("12345678");
while( cin>>s1>>s2 )
{
// 将顺序改过来
// 题目中 12345678
// 事实上是 1234
// 8765
// 我们就依照 12348765来存储
swap(s1[4],s1[7]);
swap(s1[5],s1[6]);
swap(s2[4],s2[7]);
swap(s2[5],s2[6]);
for(i=0;i<8;i++)
pos[s1[i]-'0']=i+1;
for(i=0;i<8;i++)
s2[i]=pos[s2[i]-'0'];/*置换*/
k=kangtuo(s2);
cout<<ans[k]<<endl;
}
return 0;
}
ACM-康托展开+预处理BFS之魔板——hdu1430的更多相关文章
- 转换地图 (康托展开+预处理+BFS)
Problem Description 在小白成功的通过了第一轮面试后,他来到了第二轮面试.面试的题目有点难度了,为了考核你的思维能量,面试官给你一副(2x4)的初态地图,然后在给你一副(2x4)的终 ...
- UESTC 485 Game(康托展开,bfs打表)
Game Time Limit: 4000/2000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit Status t ...
- 康托展开+反向bfs
康托展开+反向bfs hdu 1043 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1043 #include <iostream> # ...
- HDU1430 BFS + 打表 + 康托展开
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1430 , 一道比较好的题. 这道题要用到很多知识,康托展开.BFS.打表的预处理还要用到一一映射,做完 ...
- hdu 1430 (BFS 康托展开 或 map )
第一眼看到这题就直接BFS爆搜,第一发爆了内存,傻逼了忘标记了,然后就改,咋标记呢. 然后想到用map函数,就8!个不同的排列,换成字符串用map标记.然后又交一发果断超时,伤心,最恨超时,还不如来个 ...
- HDU 1430 魔板(康托展开+BFS+预处理)
魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- hdu.1430.魔板(bfs + 康托展开)
魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- hdu1430魔板(BFS+康托展开)
做这题先看:http://blog.csdn.net/u010372095/article/details/9904497 Problem Description 在魔方风靡全球之后不久,Rubik先 ...
- HDU_1430——魔板,预处理,康托展开,置换,string类的+操作
Problem Description 在魔方风靡全球之后不久,Rubik先生发明了它的简化版——魔板.魔板由8个同样大小的方块组成,每个方块颜色均不相同,可用数字1-8分别表示.任一时刻魔板的状态可 ...
随机推荐
- FZOJ--2212--Super Mobile Charger(水题)
Problem 2212 Super Mobile Charger Accept: 3 Submit: 11 Time Limit: 1000 mSec Memory Limit : 32 ...
- 36.创建自定义的指令directive
转自:https://www.cnblogs.com/best/tag/Angular/ 1. <html> <head> <meta charset="utf ...
- 如何安装MySQL?(二)
MYSQL的两种安装方式 MSI安装 ZIP安装 第一步: 第二步: 第三步: 这里我选择下载到桌面吧! 第四步: 第五步: 第六步: 第七步: 典型安装:除了安装MySQL的服务器,还安装MySQL ...
- HBase框架基础(四)
* HBase框架基础(四) 上一节我们介绍了如何使用HBase搞一些MapReduce小程序,其主要作用呢是可以做一些数据清洗和分析或者导入数据的工作,这一节我们来介绍如何使用HBase与其他框架进 ...
- codeforces 400 C Inna and Huge Candy Matrix【模拟】
题意:给出一个矩形的三种操作,顺时针旋转,逆时针旋转,对称,给出原始坐标,再给出操作数,问最后得到的坐标 画一下模拟一下操作就可以找到规律了 #include<iostream> #inc ...
- 洛谷1073 NOIP2009 最优贸易
题目大意 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双 ...
- 前端之CSS属性相关
宽和高 width属性可以为元素设置宽度. height属性可以为元素设置高度. 块级标签才能设置宽度,内联标签的宽度由内容来决定. 字体属性 文字字体 font-family可以把多个字体名称作为一 ...
- python ORM理解、元类
元类 参考链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143191 ...
- socket 编程的端口和地址复用
在linux socket网络编程中,大规模并发TCP或UDP连接时,经常会用到端口复用: int opt = 1; if(setsockopt(sockfd, SOL_SOCKET,SO_R ...
- type 'simple Class' does not conform to protocol 'Example Protocol'错误
在看swift教程中"接口和扩展"这小部分. 在编写时提示"type 'simple Class' does not conform to protocol 'Examp ...