ZOJ 2416 Open the Lock

这几天很背,老是做不出题目来
总算搞定一个,可惜速度很满,慢就慢吧,反正能过(还是BFS)
#include <iostream>
#include <queue>
using namespace std;
bool RER[10000];
struct NODE
{
 int x;
 int step;
};
int main()
{
 int t,i,a,b,n;
 int n1,n2,n3,n4;
 queue<NODE> CN;
 NODE Start,Temp,TT;
 cin >> n;
 while(n--)
 {
  cin >> a >> b;
  Start.x  = a;
  Start.step = 0;
  CN.push(Start);
  for(i =0;i<10000;++i)
   RER[i]=false;
  RER[a] = true;
  while(!CN.empty())
  {
   Temp = CN.front();
   CN.pop();
   if(Temp.x == b)
    break;
   Temp.step++;
   for(i=1;i<=1000;i*=10)
   {
    TT = Temp;
    t = TT.x%(i*10);
    if(t<i)
     t = 0;
    else
    {
     while(t>9)
      t /= 10;
    }
    if(t!=9)
     TT.x += i;
    else
     TT.x = TT.x - i*8;
    if(RER[TT.x]==false)
    {
     CN.push(TT);
     RER[TT.x]=true;
    }
    TT = Temp;
    if(t!=1)
     TT.x -= i;
    else
     TT.x = TT.x + i*8;
    if(RER[TT.x]==false)
    {
     CN.push(TT);
     RER[TT.x]=true;
    }
   }
   TT = Temp;
   n4 = Temp.x % 10;
   n3 = Temp.x % 100 / 10;
   n2 = Temp.x % 1000 / 100;   
   n1 = Temp.x / 1000;
   if(RER[n2*1000+n1*100+n3*10+n4]==false)
   {
    TT.x = n2*1000+n1*100+n3*10+n4;
    CN.push(TT);
    RER[n2*1000+n1*100+n3*10+n4] = true;
   }
   if(RER[n1*1000+n3*100+n2*10+n4]==false)
   {
    TT.x = n1*1000+n3*100+n2*10+n4;
    CN.push(TT);
    RER[n1*1000+n3*100+n2*10+n4] = true;
   }
   if(RER[n1*1000+n2*100+n4*10+n3]==false)
   {
    TT.x = n1*1000+n2*100+n4*10+n3;
    CN.push(TT);
    RER[n1*1000+n2*100+n4*10+n3] = true;
   }
  }
  cout << Temp.step << endl;
  while(!CN.empty())
   CN.pop();
 }
 return 0;
}
posted on 2006-09-29 17:11  AnewR  阅读(486)  评论(0)    收藏  举报