[HDU 1430] 魔板
魔板
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1988 Accepted Submission(s): 407
1 2 3 4
8 7 6 5
对于魔板,可施加三种不同的操作,具体操作方法如下:
A: 上下两行互换,如上图可变换为状态87654321
B: 每行同时循环右移一格,如上图可变换为41236785
C: 中间4个方块顺时针旋转一格,如上图可变换为17245368
给你魔板的初始状态与目标状态,请给出由初态到目态变换数最少的变换步骤,若有多种变换方案则取字典序最小的那种。
#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] 魔板的更多相关文章
- 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 ...
- 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+预处理)
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+hdu 3567(预处理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1430 思路:由于只是8种颜色,所以标号就无所谓了,对起始状态重新修改标号为 12345678,对目标状 ...
- ACM-康托展开+预处理BFS之魔板——hdu1430
魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- Sicily 1051: 魔板(BFS+排重)
相对1150题来说,这道题的N可能超过10,所以需要进行排重,即相同状态的魔板不要重复压倒队列里,这里我用map储存操作过的状态,也可以用康托编码来储存状态,这样时间缩短为0.03秒.关于康托展开可以 ...
随机推荐
- 02_线程的创建和启动_继承Thread方式
[简述] java使用Thread类代表线程,所有的线程都必须是Thread或者其子类的实例. 每个线程的任务就是完成一定的任务,实际上就是执行一段程序流. [创建并启动多线程的步骤(集成Thread ...
- POJ3368(RMQ)
Frequent values Description You are given a sequence of n integers a1 , a2 , ... , an in non-decreas ...
- File Operation using SHFileOperation
SHFILEOPSTRUCT Original link: http://winapi.freetechsecrets.com/win32/WIN32SHFILEOPSTRUCT.htm Refere ...
- 怎么在aspx里面添加swf文件
<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codeBase="http://down ...
- Python3 面向对象
Class 在Python中,定义类是通过class关键字: class Student(object): pass class后面紧接着是类名,即Student,类名通常是大写开头的单词,紧接着是( ...
- MYSQL Error 2006HY000:MySQL server has gone away的解决方案
MySQL server has gone away有几种情况. 1.应用程序(比如PHP)长时间的执行批量的MYSQL语句. 最常见的就是采集或者新旧数据转化. 解决方案: 在my.cnf文件中添加 ...
- How to open .ccproj in VS2010?
Q: How to open .ccproj projects types in VS2010, ccproj file type is a Cloud project i suppose. Plea ...
- Bios里,把SATA Mode Selection改为AHCI无法启动
新装系统Win7_X64,将SATA Mode Selection改为AHCI后总是重启,baidu参考: SATA的硬盘就选AHCI(全称应该是SATA AHCI),AHCI可以提升硬盘的读写速度原 ...
- django1.6之mysql配置
# Database# https://docs.djangoproject.com/en/1.6/ref/settings/#databases setting 配置修改 INSTALLED_APP ...
- “0x5003eaed” 指令引用的“0x00000000”内存。该内存不能为“read”
一.问题描述与原因分析 1.问题描述 使用VC6.0,在工具栏点击“打开文件”或者“添加文件到项目”的图标时,提示如题的错误. 2.原因分析 微软的VC6.0与office2007冲突问题. 二.解决 ...