HDU 1430 魔板
2015-11-08 19:53
387 查看
魔板
Time Limit : 10000/5000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 29 Accepted Submission(s) : 6
Problem Description
在魔方风靡全球之后不久,Rubik先生发明了它的简化版——魔板。魔板由8个同样大小的方块组成,每个方块颜色均不相同,可用数字1-8分别表示。任一时刻魔板的状态可用方块的颜色序列表示:从魔板的左上角开始,按顺时针方向依次写下各方块的颜色代号,所得到的数字序列即可表示此时魔板的状态。例如,序列(1,2,3,4,5,6,7,8)表示魔板状态为:
1 2 3 4
8 7 6 5
对于魔板,可施加三种不同的操作,具体操作方法如下:
A: 上下两行互换,如上图可变换为状态87654321
B: 每行同时循环右移一格,如上图可变换为41236785
C: 中间4个方块顺时针旋转一格,如上图可变换为17245368
给你魔板的初始状态与目标状态,请给出由初态到目态变换数最少的变换步骤,若有多种变换方案则取字典序最小的那种。
Input
每组测试数据包括两行,分别代表魔板的初态与目态。
Output
对每组测试数据输出满足题意的变换步骤。
Sample Input
12345678
17245368
12345678
82754631
Sample Output
C
AC
Author
LL
Source
ACM暑期集训队练习赛(三)
找到一种方案,从A->B。
预处理,将A字符串看成“12345678”,对应的将B字符串改变成对应的编号。
然后使用康托展开或者map标记都可以,储存对应结果。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<map>
using namespace std;
struct node
{
string str;
string s;
} a,b;
int len;
map<string,int>Mp;// 标记出现过的状态,并编号
string ed[60000];//储存所有对应编号的状态变化顺序
void bfs()
{
queue<node>q;
q.push(a);
while(q.size())
{
a=q.front();
q.pop();
b.str=a.str;
b.s=a.s;
//枚举所有移动方案,按字典序
b.s.append("A");
for(int i=0; i<4; i++)
swap(b.str[i],b.str[7-i]);
if(Mp[b.str]==0)
{
Mp[b.str]=len++;
ed[len-1]=b.s;
q.push(b);
}
b=a;
b.s.append("B");
for(int i=3; i>=0; i--)
{
char ch;
if(i-1>=0)
ch=a.str[i-1];
else ch=a.str[3];
b.str[i]=ch;
}
for(int i=4; i<8; i++)
{
char ch;
if(i+1<8)
ch=a.str[i+1];
else ch=a.str[4];
b.str[i]=ch;
}
if(Mp[b.str]==0)
{
Mp[b.str]=len++;
ed[len-1]=b.s;
q.push(b);
}
b=a;
b.s.append("C");
swap(b.str[1],a.str[6]);
swap(b.str[2],a.str[1]);
swap(b.str[5],a.str[2]);
swap(b.str[6],a.str[5]);
if(Mp[b.str]==0)
{
Mp[b.str]=len++;
ed[len-1]=b.s;
q.push(b);
}
}
return ;
}
int main()
{
len=1;
a.str=string("12345678");
a.s=string("");
Mp[a.str]=len++;
ed[Mp[a.str]]=a.s;
//预处理
bfs();
string c=string ("12345678");
while(cin>>a.str>>b.str)
{
for(int i=1; i<=8; i++)
{
char ch=i+'0';
for(int j=0; j<8; j++)
{
if(b.str[j]==a.str[i-1])
{
c[j]=ch;
break;
}
}
}
cout<<ed[Mp[c]]<<endl;
}
}
相关文章推荐
- 通达OA 升级到2015后的几点经验感受
- css大全 值得拥有
- Sql Server存储过程和函数浅谈
- js的bom对象简介
- QT之界面实现技巧
- 老王学linux-ftp
- C语言产生一个大txt文件,并进行排序
- Activity 生命周期(阅读官方文档后录)
- Adreno Profiler GPU frequency clocks per/second
- 堆排序
- GSM开发 手机发送短信控制LED,返回中文短信,C程序源代码【测试】
- 软考总结
- 简易TCP
- myeclipse代码自动提示需多次使用快捷键问题
- 智能车学习(十三)——角度控制
- HttpClient3.0入门1
- centos中Read-only file system
- Java基础01 从HelloWorld到面向对象
- Ruby(rails)win环境下安装
- 创建可以导入到myeclipse中的eclipse项目