/*
Bfs+Hash 跑的有点慢 但是codevs上时间限制10s 也ok
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define maxn 10000010
using namespace std;
int len;
bool f[maxn];
string ls,rs;
struct node
{
int step,place;
string s;
};
queue<node>q;
int Hash(node x)
{
int re=;
len=x.s.length();
for(int i=;i<=len-;i++)
re=re*+x.s[i]-'';
re=re*+x.place;
return re;
}
int main()
{
cin>>ls>>rs;
ls=' '+ls;rs=' '+rs;
node st;st.s=ls;
st.step=;st.place=;
q.push(st);f[Hash(st)]=;
while(!q.empty())
{
node k=q.front();q.pop();
string si=k.s;
int p=k.place,t=k.step;
if(si==rs)
{
cout<<t;
return ;
}
for(int i=;i<=;i++)
{
int pi,ki;node x;
string ss=si;
if(i==&&p<)
{
pi=p;pi++;
x.place=pi;x.step=t+;x.s=ss;
int hash=Hash(x);
if(f[hash]==)
{
f[hash]=;
q.push(x);
}
}
else if(i==&&ss[p]<'')
{
ss[p]++;pi=p;
x.place=pi;x.step=t+;x.s=ss;
int hash=Hash(x);
if(f[hash]==)
{
f[hash]=;
q.push(x);
}
}
else if(i==&&ss[p]>'')
{
ss[p]--;pi=p;
x.place=pi;x.step=t+;x.s=ss;
int hash=Hash(x);
if(f[hash]==)
{
f[hash]=;
q.push(x);
}
}
else if(i==)
{
char tmps=ss[p];ss[p]=ss[];ss[]=tmps;pi=p;
x.place=pi;x.step=t+;x.s=ss;
int hash=Hash(x);
if(f[hash]==)
{
f[hash]=;
q.push(x);
}
}
else if(i==)
{
char tmps=ss[p];ss[p]=ss[];ss[]=tmps;pi=p;
x.place=pi;x.step=t+;x.s=ss;
int hash=Hash(x);
if(f[hash]==)
{
f[hash]=;
q.push(x);
}
}
else if(i==&&p>)
{
pi=p;pi--;
x.place=pi;x.step=t+;x.s=ss;
int hash=Hash(x);
if(f[hash]==)
{
f[hash]=;
q.push(x);
}
}
}
}
return ;
}
/*
加上剪枝的话就ok了 200ms
对于2 3 4 5这几个点 左移右移对答案是没有贡献的 只有1 6 左移右移再加上swap0 1才有贡献
所以2 3 4 5这几个只有已经和目标相同了才左右移
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define maxn 10000010
using namespace std;
int len;
bool f[maxn];
string ls,rs;
struct node
{
int step,place;
string s;
};
queue<node>q;
int Hash(node x)
{
int re=;
len=x.s.length();
for(int i=;i<=len-;i++)
re=re*+x.s[i]-'';
re=re*+x.place;
return re;
}
int main()
{
//freopen("clever.in","r",stdin);
//freopen("clever.out","w",stdout);
cin>>ls>>rs;
ls=' '+ls;rs=' '+rs;
node st;st.s=ls;
st.step=;st.place=;
q.push(st);f[Hash(st)]=;
while(!q.empty())
{
node k=q.front();q.pop();
string si=k.s;
int p=k.place,t=k.step;
if(si==rs)
{
cout<<t;
return ;
}
for(int i=;i<=;i++)
{
int pi,ki;node x;
string ss=si;
if(i==&&p<)
{
if((p==||p==||p==)&&ss[p]!=rs[p])continue;
pi=p;pi++;
x.place=pi;x.step=t+;x.s=ss;
int hash=Hash(x);
if(f[hash]==)
{
f[hash]=;
q.push(x);
}
}
else if(i==&&ss[p]<'')
{
ss[p]++;pi=p;
x.place=pi;x.step=t+;x.s=ss;
int hash=Hash(x);
if(f[hash]==)
{
f[hash]=;
q.push(x);
}
}
else if(i==&&ss[p]>'')
{
ss[p]--;pi=p;
x.place=pi;x.step=t+;x.s=ss;
int hash=Hash(x);
if(f[hash]==)
{
f[hash]=;
q.push(x);
}
}
else if(i==)
{
char tmps=ss[p];ss[p]=ss[];ss[]=tmps;pi=p;
x.place=pi;x.step=t+;x.s=ss;
int hash=Hash(x);
if(f[hash]==)
{
f[hash]=;
q.push(x);
}
}
else if(i==)
{
char tmps=ss[p];ss[p]=ss[];ss[]=tmps;pi=p;
x.place=pi;x.step=t+;x.s=ss;
int hash=Hash(x);
if(f[hash]==)
{
f[hash]=;
q.push(x);
}
}
else if(i==&&p>)
{
if((p==||p==||p==)&&ss[p]!=rs[p])continue;
pi=p;pi--;
x.place=pi;x.step=t+;x.s=ss;
int hash=Hash(x);
if(f[hash]==)
{
f[hash]=;
q.push(x);
}
}
}
}
return ;
}

codevs 1733 聪明的打字员 (Bfs)的更多相关文章

  1. poj1184 聪明的打字员(BFS剪枝)

    http://poj.org/problem?id=1184 用字符串s存下数字,并把光标位置做一个字符加到s末尾,用map做标记状态是否出现过,然后bfs即可. 不剪枝是过不了的,考虑的两种交换操作 ...

  2. 聪明的打字员---poj1184(bfs)

    题目链接:http://poj.org/problem?id=1184 分析:首先可以发现有6*10^6种状态,比较多,不过搜索的时候可以去除一些无用的状态, 可以发现一个点的值(2-5)如果想要改变 ...

  3. codevs 3290 华容道(SPFA+bfs)

    codevs 3290华容道 3290 华容道 2013年NOIP全国联赛提高组 时间限制: 1 s  空间限制: 128000 KB 题目描述 Description 小 B 最近迷上了华容道,可是 ...

  4. Codevs 1138 聪明的质监员 2011年NOIP全国联赛提高组

    1138 聪明的质监员 2011年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 小 T 是一名质量监督员, ...

  5. POJ 1184 聪明的打字员

    简直难到没朋友. 双向bfs + 剪枝. 剪枝策略: 对于2--5位置上的数,仅仅有当光标在相应位置时通过swap ,up.down来改变.那么当当前位置没有达到目标状态时,left和right无意义 ...

  6. (广搜)聪明的打字员 -- POJ --1184

    链接: http://poj.org/problem?id=1184 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=88230#probl ...

  7. codevs 1138 聪明的质监员

    二分+前缀和. #include<iostream> #include<cstdio> #include<cstring> #include<cmath> ...

  8. poj练习题的方法

    poj1010--邮票问题 DFSpoj1011--Sticks dfs + 剪枝poj1020--拼蛋糕poj1054--The Troublesome Frogpoj1062--昂贵的聘礼poj1 ...

  9. 06day2

    蠕虫游戏 模拟 [问题描述] 蠕虫是一个古老的电脑游戏,它有许多版本.但所有版本都有一个共同规则:操纵一条蠕虫在屏幕上转圈,并试着去避免撞到自己或障碍物. 这里我们将模拟一个简单的版本.游戏将在 50 ...

随机推荐

  1. 探讨CMake中关于RPATH的使用

    最近研究CMake,发现CMake对于RPATH的管理也非常人性化.官方说法是当动态库的编译也和执行档在同级目录下的时候,CMake会自动给执行档加入适当的RPATH.具体可以通过readelf -d ...

  2. 使用HTML+CSS,jQuery编写的简易计算器

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  3. sublime常用插件及配置,自留自用

    1.Angularjs 写angularjs经常操作template文件,没有一个ng-xx的提示真的很蛋疼是不是,有些服务的名字记不住是不是,那就用这个插件吧 2.AutoFileName 如果你的 ...

  4. select options常用操作

    1.判断select选项中 是否存在Value="value"的option元素 function jsSelectIsExitItem(objSelect,objItemValu ...

  5. jquery学习 (3)文本框获取焦点之后变换样式

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. jquery 导航栏目

    JS 文件<script type="text/javascript"> $(document).ready(function(){ $(".level1 & ...

  7. VISUAL STUDIO 2005连接MYSQL数据库

    // mysql.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <string.h> #include &l ...

  8. HTML&CSS基础学习笔记1.31-像素和相对长度

    像素和相对长度 之前的笔记中,我们提到过用属性width.height来设置图片的尺寸,它们的单元都是”px(像素)”.长度单位总结一下,目前比较常用到px(像素).em.% 百分比,要注意其实这三种 ...

  9. Powerpoin怎么制作电子相册|PPT制作电子相册教程

    Powerpoin怎么制作电子相册?你是不是也对这一问题颇感兴趣呢?下面小编就为大家带来PPT制作电子相册详细教程,赶紧准备好你的自拍照什么的,开启Powerpoin制作电子相册之旅吧! Powerp ...

  10. codeforces567E. President and Roads

    题目大意:总统要回家,会经过一些街道,每条街道都是单向的并且拥有权值.现在,为了让总统更好的回家,要对每一条街道进行操作:1)如果该街道一定在最短路上,则输出“YES”.2)如果该街道修理过后,该边所 ...