| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
谁能帮我找条错误数据啊,我自测得好像是对的啊,一直RA(写的比较差)#include <cstdlib>
#include <iostream>
#include <queue>
using namespace std;
class Node
{
public :
int n;
int biao;
int count;
Node* next;
Node(int a)
{
n = a;
biao = 0;
count = 0;
next = NULL;
}
Node(int a,int b,int c)
{
n = a;
biao = b;
count = c;
next = NULL;
}
Node()
{
n = 0;
biao = 0;
count = 0;
next = NULL;
}
bool equals(Node b)
{
if(this->n!=b.n)
return false;
else if(this->biao!=b.biao)
return false;
return true;
}
};
class Hash
{
public:
Node table[2200];
Hash()
{
for(int i=0;i<2200;i++)
table[i] = Node(-2);
}
void add(Node &s)
{
int addr = hash(s);
Node* temp = &table[addr];
if(temp->n==0)
table[addr] = s;
else{
while(temp->next!=NULL)
{
temp = temp->next;
}
Node* tt = new Node(s.n,s.biao,s.count);
temp->next = tt;
temp->next->next = NULL;
}
}
int hash(Node a)
{
int re = 0;
int b = a.n;
int i = 1;
while(a.n>0)
{
re = re + (a.n%10)*i;
a.n = a.n/10;
i++;
}
return re*(a.biao+1)+b/1000;
}
Node find(Node s)
{
int addr = hash(s);
Node* p = &table[addr];
while(p!=NULL)
{
if(s.equals(*p))
return *p;
p = p ->next;
}
return Node(-1);
}
void del(Node &s)
{
int addr = hash(s);
Node* p = &table[addr];
Node* q = table[addr].next;
if((*p).equals(s))
{
if(p->next==NULL)
{
p->n =0;
}
else
{
table[addr] = *(table[addr].next);
}
}
else{
while(p->next!=NULL)
{
Node* current = p->next;
if(s.equals(*(p->next)))
{
Node* q = p->next->next;
current = p->next;
p->next = q;
}
p = current;
}
}
}
};
void toArray(int a,int b[])
{
for(int i=5;i>=0;i--)
{
b[i] = a%10;
a = a/10;
}
}
int toNum(int b[])
{
int a = 0;
for(int i=0;i<6;i++)
{
a = a*10 +b[i];
}
return a;
}
class Memo
{
public:
int a[10];
int top;
Memo()
{
for(int i=0;i<10;i++)
a[i]=-1;
top = 0;
}
bool find(int n)
{
for(int i=0;i<top;i++)
{
if(a[i]==n)
return 1;
}
return 0;
}
void insert(int n)
{
if(!this->find(n))
a[top++] = n;
}
bool allMore(int n)
{
for(int i=0;i<top;i++)
{
if(n<=a[i])
return 0;
}
return 1;
}
bool allLess(int n)
{
for(int i=0;i<top;i++)
{
if(n>=a[i])
return 0;
}
return 1;
}
};
Node done(Node s,int c)
{
int s1[6];
for(int i=0;i<6;i++)
{
s1[i] = 0;
}
toArray(s.n,s1);
if(c==0){
int temp = s1[0];
s1[0] = s1[s.biao];
s1[s.biao] = temp;
}
else if(c==1){
int temp = s1[5];
s1[5] = s1[s.biao];
s1[s.biao] = temp;
}
else if(c==2){
if(s1[s.biao]>=9);
else
s1[s.biao] ++;
}
else if(c==3){
if(s1[s.biao]<=0);
else
s1[s.biao] --;
}
else if(c==4){
if(s.biao==0);
else s.biao--;
}
else if(c==5){
if(s.biao==5);
else s.biao++;
}
s.n = toNum(s1);
return s;
}
bool check(queue<int> a,int biao)
{
while(a.size()!=0)
{
if(a.front()==biao)
return true;
a.pop();
}
return false;
}
Node find(queue<Node> mq,Node a)
{
while(mq.size()!=0)
{
if((mq.front()).equals(a))
return mq.front();
mq.pop();
}
Node ceng(-1);
return ceng;
}
int search(Node a,Node b)
{
if(a.n==b.n&&a.biao==b.biao)
return 0;
queue<Node> q1;
queue<Node> q2;
Node ceng(-1);
q1.push(a);
q1.push(ceng);
q2.push(b);
q2.push(ceng);
Node ew1 ;
Node ew2 ;
int count1 = 0;
int count2 = 0;
Hash t1;
Hash t2;
t1.add(a);
t2.add(b);
Memo memo1;
Memo memo2;
int array1[6] ;
int array2[6] ;
for(int i=0;i<6;i++)
{
array1[i] = 0;
array2[i] = 0;
}
toArray(a.n,array1);
toArray(b.n,array2);
for(int i=0;i<6;i++)
{
memo1.insert(array1[i]);
memo2.insert(array2[i]);
}
while(true)
{
if(q1.size()!=0){
ew1 = q1.front();
q1.pop();
if(ew1.equals(ceng))
{
q1.push(ceng);
count1++;
ew1 = q1.front();
q1.pop();
}
for(int i=0;i<6;i++)
{
int s11[6];
toArray(ew1.n,s11);
if(!memo2.find(s11[ew1.biao])&&(i==0||i==1||i==4||i==5))
continue;
if(memo2.allMore(s11[ew1.biao])&&i==2)
continue;
if(memo2.allLess(s11[ew1.biao])&&i==3)
continue;
Node ew = ew1;
ew = done(ew,i);
Node temp = t2.find(ew);
if(!temp.equals(ceng)){
return ew.count + temp.count + 1;
}
if(ew.equals(t1.find(ew)))
continue;
ew.count = count1 + 1;
q1.push(ew);
t1.add(ew);
}
}
if(q2.size()!=0){
ew2 = q2.front();
q2.pop();
if(ew2.equals(ceng))
{
q2.push(ceng);
count2++;
ew2 = q2.front();
q2.pop();
}
for(int i=0;i<6;i++)
{
int s22[6];
toArray(ew2.n,s22);
if(!memo1.find(s22[ew2.biao])&&(i==0||i==1||i==4||i==5))
continue;
if(memo1.allMore(s22[ew2.biao])&&i==2)
continue;
if(memo1.allLess(s22[ew2.biao])&&i==3)
continue;
Node ew = ew2;
ew = done(ew,i);
Node temp = t1.find(ew);
if(!temp.equals(ceng)){
return ew.count + temp.count + 1;
}
if(ew.equals(t2.find(ew)))
continue;
ew.count = count2 + 1;
q2.push(ew);
t2.add(ew);
}
}
}
}
int main()
{
int a,b;
while ( cin >> a >> b){
Node s1(a);
Node s2(b);
int count = search(a,b);
for(int i=1;i<6;i++)
{
s2 = Node(b,i,0);
int count1 = search(a,s2);
if(count>count1)
count = count1;
}
cout<<count<<endl;
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator