| ||||||||||
| 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 | |||||||||
Re:暴代码,代码有点冗余哈!!!所以长了点。。In Reply To:第一次写的双向广搜,一直TLE...TLE,无奈不想重写,就保存了000000 999999的答案59,结果就是AC了。。。 Posted by:CSUST_14 at 2013-04-25 11:56:32 #include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#define N 300000
#define K 1000000
#define M 6
//int M1,M2;
struct State
{
int ar[M];
int pos;
int step;
State(int n=0)
{
memset(ar,0,sizeof(ar));
int k=5;
while(n)
{
ar[k--] = n%10;
n/=10;
}
pos = step = 0;
}
int Value()
{
int ans = 0;
for(int i=0;i<6;i++) ans = ans *10 + ar[i];
return ans;
}
};
State Queue1[N];
State Queue2[N];
int Is[K][M];
int Solve(int s,int tt)
{
if(s==tt) return 0;
int step1 = 0,step2 = 0;
int rear1 = 0,head1 = 1;
int rear2 = 0,head2 = 1;
State start1(s); State start2(tt);
Is[start1.Value()][0] = 1;Is[tt][0] = Is[tt][1] = Is[tt][2] = Is[tt][3]=Is[tt][4]=Is[tt][5] = 2;
Queue1[rear1] = start1;
Queue2[rear2] = start2;
start2.pos++;Queue2[head2++] = start2;
start2.pos++;Queue2[head2++] = start2;
start2.pos++;Queue2[head2++] = start2;
start2.pos++;Queue2[head2++] = start2;
start2.pos++;Queue2[head2++] = start2;
while(true)
{
while(rear1!=head1)
{
State tmp = Queue1[rear1]; if(tmp.step != step1) break;
rear1++;rear1%=N;
State var = tmp; var.step++;
//swap0
if(var.pos !=0)
{
int t = var.ar[0]; var.ar[0] = var.ar[var.pos];
var.ar[var.pos] = t;
t = var.Value();
if(!Is[t][var.pos])
{
Queue1[head1++] = var;head1%=N;Is[t][var.pos]=1;
}
else if(Is[t][var.pos]==2) return var.step + step2;
t = var.ar[0]; var.ar[0] = var.ar[var.pos];
var.ar[var.pos] = t;
}
//swap1
if(var.pos !=5)
{
int t = var.ar[5]; var.ar[5] = var.ar[var.pos];
var.ar[var.pos] = t;
t = var.Value();
if(!Is[t][var.pos])
{
Queue1[head1++] = var;head1%=N;Is[t][var.pos]=1;
}
else if(Is[t][var.pos]==2) return var.step + step2;
t = var.ar[5]; var.ar[5] = var.ar[var.pos];
var.ar[var.pos] = t;
}
//right
if(var.pos !=5)
{
var.pos++;
int t = var.Value();
if(!Is[t][var.pos])
{
Queue1[head1++] = var;head1%=N;Is[t][var.pos]=1;
}
else if(Is[t][var.pos]==2) return var.step + step2;
var.pos--;
}
//Up
if(var.ar[var.pos]!=9)
{
var.ar[var.pos]++;
int t = var.Value();
if(!Is[t][var.pos])
{
Queue1[head1++] = var;head1%=N;Is[t][var.pos]=1;
}
else if(Is[t][var.pos]==2) return var.step + step2;
var.ar[var.pos]--;
}
//Down
if(var.ar[var.pos]!=0)
{
var.ar[var.pos]--;
int t = var.Value();
if(!Is[t][var.pos])
{
Queue1[head1++] = var;head1%=N;Is[t][var.pos]=1;
}
else if(Is[t][var.pos]==2) return var.step + step2;
var.ar[var.pos]++;
}
}
step1++;
while(rear2!=head2)
{
State tmp = Queue2[rear2]; if(tmp.step != step2) break;
rear2++;rear2%=N;
State var = tmp; var.step++;
//swap0
if(var.pos !=0)
{
int t = var.ar[0]; var.ar[0] = var.ar[var.pos];
var.ar[var.pos] = t;
t = var.Value();
if(!Is[t][var.pos])
{
Queue2[head2++] = var;head2%=N;Is[t][var.pos]=2;
}
else if(Is[t][var.pos]==1) return var.step + step1;
t = var.ar[0]; var.ar[0] = var.ar[var.pos];
var.ar[var.pos] = t;
}
//swap1
if(var.pos !=5)
{
int t = var.ar[5]; var.ar[5] = var.ar[var.pos];
var.ar[var.pos] = t;
t = var.Value();
if(!Is[t][var.pos])
{
Queue2[head2++] = var;head2%=N;Is[t][var.pos]=2;
}
else if(Is[t][var.pos]==1) return var.step + step1;
t = var.ar[5]; var.ar[5] = var.ar[var.pos];
var.ar[var.pos] = t;
}
//left
if( var.pos !=0)
{
var.pos--;
int t = var.Value();
if(!Is[t][var.pos])
{
Queue2[head2++] = var;head2%=N;Is[t][var.pos]=2;
}
else if(Is[t][var.pos]==1) return var.step + step1;
var.pos++;
}
//Up
if(var.ar[var.pos]!=9)
{
var.ar[var.pos]++;
int t = var.Value();
if(!Is[t][var.pos])
{
Queue2[head2++] = var;head2%=N;Is[t][var.pos]=2;
}
else if(Is[t][var.pos]==1) return var.step + step1;
var.ar[var.pos]--;
}
//Down
if(var.ar[var.pos]!=0)
{
var.ar[var.pos]--;
int t = var.Value();
if(!Is[t][var.pos])
{
Queue2[head2++] = var;head2%=N;
Is[t][var.pos]=2;
}
else if(Is[t][var.pos]==1) return var.step + step1;
var.ar[var.pos]++;
}
}
step2++;
}
}
int main()
{
int s,t;
while(scanf("%d%d",&s,&t)!=EOF)
{
if(s==0 && t==999999) {printf("59\n");continue;}
memset(Is,0,sizeof(Is));
printf("%d\n",Solve(s,t));
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator