魔板

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1988    Accepted Submission(s): 407

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
 
预处理出所有答案
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <map>
#include <string>
using namespace std;
#define N 326888 bool vis[N];
string way[N];
int fac[]={,,,,,,,,,}; struct node
{
string s;
string op;
}; int Find(string &s)
{
int i,j,res=;
bool has[]={};
for(i=;i<;i++)
{
int x=s[i]-'',y=;
for(j=;j<x;j++)
{
if(!has[j]) y++;
}
res+=y*fac[-i];
has[x]=;
}
return res+;
} void bfs()
{
int i,j;
node now,next;
queue<node> q;
memset(vis,,sizeof(vis));
now.s="";
now.op="";
q.push(now);
vis[Find(now.s)]=;
while(!q.empty())
{
now=q.front();
q.pop();
way[Find(now.s)]=now.op;
for(int i=;i<=;i++)
{
next=now;
if(i==)
{
next.op+='A';
swap(next.s[],next.s[]);
swap(next.s[],next.s[]);
swap(next.s[],next.s[]);
swap(next.s[],next.s[]);
}
else if(i==)
{
next.op+='B';
char ch=next.s[];
for(j=;j>=;j--) next.s[j]=next.s[j-];
next.s[]=ch;
ch=next.s[];
for(j=;j<;j++) next.s[j]=next.s[j+];
next.s[]=ch;
}
else
{
next.op+='C';
char ch=next.s[];
next.s[]=next.s[];
next.s[]=next.s[];
next.s[]=next.s[];
next.s[]=ch;
}
if(!vis[Find(next.s)])
{
vis[Find(next.s)]=;
q.push(next);
}
}
}
}
int main()
{
bfs();
string s1,s2;
while(cin>>s1>>s2)
{
map<char,char> mp;
for(int i=;i<;i++) //好吧、这儿写反了,WA- -
{
mp[s1[i]]=i++'';
}
for(int i=;i<;i++)
{
s2[i]=mp[s2[i]];
}
cout<<way[Find(s2)]<<endl;
}
return ;
}

[HDU 1430] 魔板的更多相关文章

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

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

  2. hdu.1430.魔板(bfs + 康托展开)

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

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

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

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

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

  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+hdu 3567(预处理)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1430 思路:由于只是8种颜色,所以标号就无所谓了,对起始状态重新修改标号为 12345678,对目标状 ...

  8. ACM-康托展开+预处理BFS之魔板——hdu1430

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

  9. Sicily 1051: 魔板(BFS+排重)

    相对1150题来说,这道题的N可能超过10,所以需要进行排重,即相同状态的魔板不要重复压倒队列里,这里我用map储存操作过的状态,也可以用康托编码来储存状态,这样时间缩短为0.03秒.关于康托展开可以 ...

随机推荐

  1. 此一生 一个纯js的ajax

    /** * 得到ajax对象 */ function getajaxHttp() { var xmlHttp; try { // Firefox, Opera 8.0+, Safari xmlHttp ...

  2. 九度OJ 1514 数值的整数次方【算法】

    题目地址:http://ac.jobdu.com/problem.php?pid=1514 题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的expo ...

  3. ThinkPHP3.2 加载过程(三)

    上次回顾: IS_CGI ,IS_WIN,IS_CLI,MAGIC_QUOTES_GPC干嘛用 IS_WIN 看了一下后面的代码  基本上就是为了保证在不同环境下运行时,由于有些操作系统会对文件路径大 ...

  4. iOS 分类思想(2)

    /******************* NSString+NumCount.h文件 ******************************/ #import <Foundation/Fo ...

  5. Mysql表操作

    查看表结构: 可以使用describe或show create table语句查看表的结构: describe表名; Show create table 表名; 修改表名: Alter table 旧 ...

  6. Linux启动级别

    一共有7种启动级别,分别为: #   0 - halt (Do NOT set initdefault to this)  #   1 - Single user mode  #   2 - Mult ...

  7. json,serialze之格式

    <?php echo 'array-json:' . "\n"; $arr = array('key1'=>'value1', 'key2' => 'value2 ...

  8. python log 层次结构

    文件结构 - run.py - b -- __init__.py run.py import logging import b log = logging.getLogger("" ...

  9. Python的进程间通信

    进程间通讯有多种方式,包括信号,管道,消息队列,信号量,共享内存,socket等 1.共享内存 Python可以通过mmap模块实现进程之间的共享内存 mmap文件对象既像一个字符串也像一个普通文件对 ...

  10. Ubuntu 下部署asp.net运行环境

    在Ubuntu下部署asp.net运行环境,网上教程很多,基本都是编译Mono源码,然后安装jexus.但是可能是我最近RP不太好,编译Mono源码一直都是失败,无奈之下只好找另外的方法安装了. 网上 ...