codevs 1733 聪明的打字员 (Bfs)

Posted 一入OI深似海

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codevs 1733 聪明的打字员 (Bfs)相关的知识,希望对你有一定的参考价值。

/*
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=0;
    len=x.s.length();
    for(int i=1;i<=len-1;i++)
      re=re*10+x.s[i]-0;
    re=re*10+x.place;
    return re;
}
int main()
{
    cin>>ls>>rs;
    ls= +ls;rs= +rs;
    node st;st.s=ls;
    st.step=0;st.place=1;
    q.push(st);f[Hash(st)]=1;
    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 0;
          }
        for(int i=1;i<=6;i++)
          {
              int pi,ki;node x;
              string ss=si;
              if(i==1&&p<6)
              {
                pi=p;pi++;
                x.place=pi;x.step=t+1;x.s=ss;
                int hash=Hash(x);
                    if(f[hash]==0)
                      {
                          f[hash]=1;
                          q.push(x);
                  }
              }
            else if(i==2&&ss[p]<9)
              {
                  ss[p]++;pi=p;
                x.place=pi;x.step=t+1;x.s=ss;
                int hash=Hash(x);
                    if(f[hash]==0)
                      {
                          f[hash]=1;
                          q.push(x);
                  }
              }
            else if(i==3&&ss[p]>0)
              {
                  ss[p]--;pi=p;
                    x.place=pi;x.step=t+1;x.s=ss;
                int hash=Hash(x);
                    if(f[hash]==0)
                      {
                          f[hash]=1;
                          q.push(x);
                  }
              }
            else if(i==4)
              {
                  char tmps=ss[p];ss[p]=ss[1];ss[1]=tmps;pi=p;
                  x.place=pi;x.step=t+1;x.s=ss;
                  int hash=Hash(x);
                    if(f[hash]==0)
                      {
                          f[hash]=1;
                          q.push(x);
                  }
              }
            else if(i==5)
              {
                  char tmps=ss[p];ss[p]=ss[6];ss[6]=tmps;pi=p;
                  x.place=pi;x.step=t+1;x.s=ss;
                  int hash=Hash(x);
                    if(f[hash]==0)
                      {
                          f[hash]=1;
                          q.push(x);
                  }
              }
             else if(i==6&&p>1)
              {
                pi=p;pi--;
                x.place=pi;x.step=t+1;x.s=ss;
                int hash=Hash(x);
                    if(f[hash]==0)
                      {
                          f[hash]=1;
                          q.push(x);
                  }
              }
          }
      }
    return 0;
}
/*
加上剪枝的话就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=0;
    len=x.s.length();
    for(int i=1;i<=len-1;i++)
      re=re*10+x.s[i]-0;
    re=re*10+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=0;st.place=1;
    q.push(st);f[Hash(st)]=1;
    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 0;
          }
        for(int i=1;i<=6;i++)
          {
              int pi,ki;node x;
              string ss=si;
              if(i==1&&p<6)
              {
                  if((p==2||p==3||p==4)&&ss[p]!=rs[p])continue;
                pi=p;pi++;
                x.place=pi;x.step=t+1;x.s=ss;
                int hash=Hash(x);
                    if(f[hash]==0)
                      {
                          f[hash]=1;
                          q.push(x);
                  }
              }
            else if(i==2&&ss[p]<9)
              {
                  ss[p]++;pi=p;
                x.place=pi;x.step=t+1;x.s=ss;
                int hash=Hash(x);
                    if(f[hash]==0)
                      {
                          f[hash]=1;
                          q.push(x);
                  }
              }
            else if(i==3&&ss[p]>0)
              {
                  ss[p]--;pi=p;
                    x.place=pi;x.step=t+1;x.s=ss;
                int hash=Hash(x);
                    if(f[hash]==0)
                      {
                          f[hash]=1;
                          q.push(x);
                  }
              }
            else if(i==4)
              {
                  char tmps=ss[p];ss[p]=ss[1];ss[1]=tmps;pi=p;
                  x.place=pi;x.step=t+1;x.s=ss;
                  int hash=Hash(x);
                    if(f[hash]==0)
                      {
                          f[hash]=1;
                          q.push(x);
                  }
              }
            else if(i==5)
              {
                  char tmps=ss[p];ss[p]=ss[6];ss[6]=tmps;pi=p;
                  x.place=pi;x.step=t+1;x.s=ss;
                  int hash=Hash(x);
                    if(f[hash]==0)
                      {
                          f[hash]=1;
                          q.push(x);
                  }
              }
             else if(i==6&&p>1)
              {
                  if((p==2||p==3||p==4)&&ss[p]!=rs[p])continue;
                pi=p;pi--;
                x.place=pi;x.step=t+1;x.s=ss;
                int hash=Hash(x);
                    if(f[hash]==0)
                      {
                          f[hash]=1;
                          q.push(x);
                  }
              }
          }
      }
    return 0;
}

 

以上是关于codevs 1733 聪明的打字员 (Bfs)的主要内容,如果未能解决你的问题,请参考以下文章

[Codevs] 1138 聪明的质监员

CODEVS 1138 聪明的质监员

codevs 3333 高级打字机

洛谷 P1383 高级打字机==codevs 3333 高级打字机

BFS简单题套路_Codevs 1215 迷宫

洛谷 P1383 codevs 3333 高级打字机