小蟹是一名魔法少女,能熟练的施放很多魔法。

有一天魔法学院上课的时候出现了这样一道题,给一个6位数,让大家用自己的魔法,把这个6位数变成另一个给定的6位数。

小蟹翻了下魔法书,发现她有以下6种魔法:

  1. 将当前魔杖指向的数字与最左端的一个数字调换位置。

  2. 将当前魔杖指向的数字与最右端的一个数字调换位置。

  3. 将当前魔杖指向的数字+1。(若当前魔杖指向的数字为9则无效)

  4. 将当前魔杖指向的数字−1。(若当前魔杖指向的数字为0则无效)

  5. 将当前魔杖向右移动一位。

  6. 将当前魔杖向左移动一位。

最开始,她的魔杖指向的是最左边的数字。

于是小蟹很好奇,以她的能力,施展几次魔法能完成老师的这道题呢?

Input

多组数据,请处理至文件结束(EOF)

对于每组数据,包含两个6位数,a,b。

Output

对于每组数据,输出一个数,代表最少施展魔法的次数。

Sample input and output

Sample Input Sample Output
123456 654321
11

解题报告

不好想。。肯定不能处理操作3和操作4,那样bfs直接爆炸。。。本题连A*也不行。。因为状态数实在太多,又是多Case。。

难保不TLE,因此我们预处理出魔杖能到达地方的状态,之后扫一遍所有状态,加上差值就完辣

 #include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std; const int MaxHashSize = ;
const int MaxStatusSize = ;
typedef struct status
{
int step,value;
bool arrive[];
}; int Head[MaxHashSize];
int Next[MaxStatusSize];
status st[MaxStatusSize];
int caculate[] = {,,,,,,};
int tar_num[]; void Hash_init()
{
memset(Head,-,sizeof(Head));
} int GetHashNum(int& x)
{
return x % MaxHashSize;
} bool insert_Hash(int id)
{
int h = GetHashNum(st[id].value);
int t = Head[h];
while(t != -)
{
if(st[id].value == st[t].value)
return false;
t = Next[t];
}
Next[id] = Head[h];
Head[h] = id;
return true;
} int bfs()
{
int front = ,rear = ;
insert_Hash();
while(front < rear)
{
status ss = st[front++];
int num[];
int ori = ss.value;
for(int i = ; i >= ; --i)
{
num[i] = ss.value % ;
ss.value /= ;
}
int pos = num[];
bool flag = true;
if (num[pos] == || pos == ) flag = false;
if (flag)
{
st[rear] = ss;
int temp = num[];
num[] = num[pos];
num[pos] = temp;
int value = ;
for(int i = ; i < ; ++ i)
value += (num[i]*caculate[i]);
st[rear].value = value;
if (insert_Hash(rear))
{
st[rear].step = ss.step + ;
st[rear++].arrive[] = true;
}
num[pos] = num[];
num[] = temp;
}
flag = true;
if (num[] == && pos == ) flag = false;
if (pos == ) flag = false;
if (flag)
{
st[rear] = ss;
int temp = num[];
num[] = num[pos];
num[pos] = temp;
int value = ;
for(int i = ; i < ; ++ i)
value += (num[i]*caculate[i]);
st[rear].value = value;
if (insert_Hash(rear))
{
st[rear].step = ss.step + ;
st[rear++].arrive[] = true;
}
num[pos] = num[];
num[] = temp;
}
if (pos < )
{
st[rear] = ss;
int value = ori + ;
st[rear].value = value;
if (insert_Hash(rear))
{
st[rear].step = ss.step + ;
st[rear++].arrive[pos+] = true;
}
}
if (pos > )
{
st[rear] = ss;
int value = ori - ;
st[rear].value = value;
if (insert_Hash(rear))
{
st[rear].step = ss.step + ;
st[rear++].arrive[pos-] = true;
}
}
}
return rear;
} int slove(int x)
{
int Mo = ;
for(int i = ; i < x; ++ i)
{
//cout << "i is " << i << endl;
int num[];
st[i].value /= ;
int ori = st[i].value;
for(int j = ;j >= ;--j)
{
num[j] = st[i].value % ;
st[i].value /= ;
}
int res = st[i].step;
for(int k = ; k < ;++k)
if (tar_num[k] != num[k] && !st[i].arrive[k])
{
res = ;
break;
}
else
res += (abs(tar_num[k]-num[k]));
//cout << "Res is " << res << endl;
Mo = min(Mo,res);
}
return Mo;
} int main(int argc, char * argv[])
{
int s1,s2;
while(scanf("%d%d",&s1,&s2) == )
{
Hash_init();
st[].value = s1*;
st[].step = ;
memset(st[].arrive,false,sizeof(st[].arrive));
st[].arrive[] = true;
for(int i = ;i>=;--i)
{
tar_num[i] = s2 % ;
s2 /= ;
}
cout << slove(bfs()) << endl;
}
return ;
}

UESTC_魔法少女小蟹 CDOJ 710的更多相关文章

  1. UESTC_树上战争 CDOJ 32

    给一棵树,如果树上的某个节点被某个人占据,则它的所有儿子都被占据,lxh和pfz初始时分别站在两个节点上,谁当前所在的点被另一个人占据,他就输了比赛,问谁能获胜. Input 输入包含多组数据 每组第 ...

  2. UESTC_温泉旅店 CDOJ 878

    天空飘下一朵一朵的雪花,这是一片纯白的世界. 在天空之下的温泉旅店里,雪菜已醉倒在一旁,冬马与春希看了看说着梦话的雪菜,决定找一点玩的来度过这愉快的晚上. 这家旅店提供一种特色游戏,游戏有n张牌,各写 ...

  3. UESTC_贪吃蛇 CDOJ 709

    相信大家都玩过贪吃蛇游戏吧. 在n×m的迷宫中,有着一条长度不超过9的贪吃蛇,它已经将所有的食物吃光了,现在的目标是移动到出口. 它走的时候不能碰到自己的身体,也不能碰到墙壁.(如果贪吃蛇的长度> ...

  4. 2014 UESTC暑前集训搜索专题解题报告

    A.解救小Q BFS.每次到达一个状态时看是否是在传送阵的一点上,是则传送到另一点即可. 代码: #include <iostream> #include <cstdio> # ...

  5. UESTC_敢说就敢做 CDOJ 631

    敢说就敢做 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Sta ...

  6. UESTC_方老师的分身 II CDOJ 915

    方老师的分身 II Time Limit: 10000/5000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  7. UESTC_方老师分身 I CDOJ 914

    方老师分身 I Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit S ...

  8. UESTC_握手 CDOJ 913

    握手 Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status ...

  9. UESTC_神秘绑架案 CDOJ 881

    神秘绑架案 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Sta ...

随机推荐

  1. Javascript或jQuery方法产生任意随机整数

    方法1:javascritp方法 1 2 3 4 5 6 //随机数    function diu_Randomize(b,e){        if(!b && b!=0 || ! ...

  2. Visual Assist X在Windows 8.1下出现中文乱码的解决方法

    这主要是输入法造成的,我的输入法中有US.中文.搜狗输入法三个输入法:通过搜狗输入法管理器把“中文”去掉,或者通过语言首选项把“中文”去掉就不会在出现乱码. 这个办法的思路来自于http://www. ...

  3. ubuntu 14.04 下试用Sublime Text 3

    很多源代码都没有IDE支持的,尤其是开源的源代码.从github上下载的,很多也不用IDE.包括我自己公司的代码,基本都是脚本,也不用IDE.通常情况下,都是用notepad++.UE之类的文本编辑器 ...

  4. WebFrom模拟MVC

    如:  aspx前台     这样写生成页面时不会产生新的html标签,用控件则会产生新的html标签 <h1><%= title %></h1> <p> ...

  5. python高级编程(第12章:优化学习)3

    #微观剖析 ''' 当找到速度很慢函数时,有时还需要做到测试某个部分函数剖析工作,这需要通过手动对一部分代码速度测试完成 ''' """ import tempfile, ...

  6. 【iOS开发-66】QQ设置界面的案例:利用storyboard开发静态的tableView界面,核心是Static Cells

    (1)效果 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2Vpc3ViYW8=/font/5a6L5L2T/fontsize/400/fill/I0JB ...

  7. Codeforces 67C Sequence of Balls 编辑距离 dp

    题目链接:点击打开链接 有一个交换操作比較特殊,所以记录每一个点距离自己近期的那个字符的位置 然后交换就相当于把第一行要交换的2个字符 之间的字符都删掉 把第二行要交换的2个字符 之间的字符都插入第一 ...

  8. Hacker(14)----扫描目标计算机端口

    端口是目前计算机与外界的通道,因而黑客一旦锁定目标计算机,便会扫描该计算机中已经开放的端口,从而得到更多的有用信息.扫描目标计算机端口一般使用SuperScan.X-Scan等. 一.端口扫描原理 扫 ...

  9. mvc分页生成静态页,mvc生成静态页

    http://blog.csdn.net/xxj_jing/article/details/7899125 分页生成静态页 http://www.cnblogs.com/luanyilin/archi ...

  10. js如何关闭当前页,而不弹出提示框

    //关闭当前页面,并且打开新页面,(不提示) function closeWinAndOpen(url) { //利用随机数处理WinName var sWinName = "LR" ...