I use "next_permutation" to generate every sequence of wheels to adjust .. and backtracking.. but WA..
please help me.. T.T
Code: Select all
Moderator: Board moderators
Code: Select all
Code: Select all
1 0 9 9,
9 0 9 9,
0 1 9 9,
0 9 9 9,
.........
Code: Select all
1
0 0 9 9
2 0 9 9
2
1 0 9 9
9 0 9 9
my answer is 4 in this case. Is it right?helloneo wrote:Code: Select all
1 0 0 9 9 2 0 9 9 2 1 0 9 9 9 0 9 9
Code: Select all
/*
Playing with wheels, Uva # 10067
Nephtali Garrido
24/06/06
*/
#include <cstdio>
using namespace std;
struct conf
{ bool disp;
int d;
}v[10000];
int m,n,a,b,c,d,i,o,col[10000],cab,rab,c2,ii;
int main()
{ scanf("%d",&m);
while(m>0)
{ scanf("%d %d %d %d",&a,&b,&c,&d);
i=d+(c*10)+(b*100)+(a*1000);
scanf("%d %d %d %d",&a,&b,&c,&d);
o=d+(c*10)+(b*100)+(a*1000);
scanf("%d",&n);
for(c2=0;c2<10000;c2++)
v[c2].disp=true;
for(c2=0;c2<n;c2++)
{ scanf("%d %d %d %d",&a,&b,&c,&d);
ii=d+(c*10)+(b*100)+(a*1000);
v[ii].disp=false;
v[ii].d=-1;
}
if(v[i].d==-1 || v[o].disp==false)
printf("-1\n");
else if(i==o)
printf("0\n");
else
{v[i].disp=false;
v[i].d=0;
cab=0;
rab=-1;
col[cab]=i;
while(rab!=cab)
{ rab++;
if(rab==10000)
rab=0;
c2=i=col[rab];
d=v[i].d;
d++;
if(i%10==0)
i+=9;
else
i--;
if(i==o)
break;
else if(v[i].disp==true)
{ cab++;
if(cab==10000)
cab=0;
col[cab]=i;
v[i].disp=false;
v[i].d=d;
}
i=c2;
if(i%10==9)
i-=9;
else
i++;
if(i==o)
break;
else if(v[i].disp==true)
{ cab++;
if(cab==10000)
cab=0;
col[cab]=i;
v[i].disp=false;
v[i].d=d;
}
i=c2;
if((i/10)%10==0)
i+=90;
else
i-=10;
if(i==o)
break;
else if(v[i].disp==true)
{ cab++;
if(cab==10000)
cab=0;
col[cab]=i;
v[i].disp=false;
v[i].d=d;
}
i=c2;
if((i/10)%10==9)
i-=90;
else
i+=10;
if(i==o)
break;
else if(v[i].disp==true)
{ cab++;
if(cab==10000)
cab=0;
col[cab]=i;
v[i].disp=false;
v[i].d=d;
}
i=c2;
if((i/100)%10==0)
i+=900;
else
i-=100;
if(i==o)
break;
else if(v[i].disp==true)
{ cab++;
if(cab==10000)
cab=0;
col[cab]=i;
v[i].disp=false;
v[i].d=d;
}
i=c2;
if((i/100)%10==9)
i-=900;
else
i+=100;
if(i==o)
break;
else if(v[i].disp==true)
{ cab++;
if(cab==10000)
cab=0;
col[cab]=i;
v[i].disp=false;
v[i].d=d;
}
i=c2;
if((i/1000)%10==0)
i+=9000;
else
i-=1000;
if(i==o)
break;
else if(v[i].disp==true)
{ cab++;
if(cab==10000)
cab=0;
col[cab]=i;
v[i].disp=false;
v[i].d=d;
}
i=c2;
if((i/1000)%10==9)
i-=9000;
else
i+=1000;
if(i==o)
break;
else if(v[i].disp==true)
{ cab++;
if(cab==10000)
cab=0;
col[cab]=i;
v[i].disp=false;
v[i].d=d;
}
}
if(rab==cab)
printf("-1\n");
else
printf("%d\n",d);
}
m--;
}
return 0;
}
Code: Select all
#include <cstdio>
#include <cstring>
bool mat[12][12][12][12];
int dl[10]={0,1,2,3,4,5,6,7,8,9};
int s[15];
int d[15];
int main()
{
int tst,i,fb;
int a,b,c,dd;
scanf("%d",&tst);
while(tst--){
memset(mat,false,sizeof(mat));memset(mat,false,sizeof(s));memset(mat,false,sizeof(d));
for(i=0;i<1;i++) {
scanf("%d%d%d%d",&s[0],&s[1],&s[2],&s[3]);
scanf("%d%d%d%d",&d[0],&d[1],&d[2],&d[3]);
}
scanf("%d",&fb);
for(i=0;i<fb;i++){
scanf("%d%d%d%d",&a,&b,&c,&dd);
mat[a][b][c][dd]=true;
}
int head=0,cost=0;
if(mat[s[0]][s[1]][s[2]][s[3]]==true){printf("-1\n");continue;}
if(mat[d[0]][d[1]][d[2]][d[3]]==true){printf("-1\n");continue;}
while(head<4){
bool flag1,flag2;
flag1=flag2=true;
int c1=0,c2=0,temp=s[head];
for(i=1;i<=10;i++){
if(mat[temp][s[1]][s[2]][s[3]]==true&&head==0){
flag1=false;
break;
}
else if(mat[s[0]][temp][s[2]][s[3]]==true&&head==1){
flag1=false;
break;
}
else if(mat[s[0]][s[1]][temp][s[3]]==true&&head==2){
flag1=false;
break;
}
else if(mat[s[0]][s[1]][s[2]][temp]==true&&head==3){
flag1=false;
break;
}
if(temp==d[head]){
break;
}
else {
temp=dl[(10+s[head]-i)%10];
c1++;
}
}
temp=s[head];
for(i=1;i<=10;i++){
if(mat[temp][s[1]][s[2]][s[3]]==true&&head==0){
flag2=false;
break;
}
else if(mat[s[0]][temp][s[2]][s[3]]==true&&head==1){
flag2=false;
break;
}
else if(mat[s[0]][s[1]][temp][s[3]]==true&&head==2){
flag2=false;
break;
}
else if(mat[s[0]][s[1]][s[2]][temp]==true&&head==3){
flag2=false;
break;
}
if(temp==d[head]){
break;
}
else {
temp=dl[(10+s[head]+i)%10];
c2++;
}
}
if(flag1==false&&flag2==false) break;
if(flag1==false&&flag2==true) cost+=c2;
else if(flag1==true&&flag2==false) cost+=c1;
else {
if(c1<c2) cost+=c1;
else if(c1==c2) cost+=c2;
else cost+=c2;
}
s[head]=temp;
head++;
}
if(s[0]==d[0]&&s[1]==d[1]&&s[2]==d[2]&&s[3]==d[3]) printf("%d\n",cost);
else printf("-1\n");
}
return 0;
}
Code: Select all
ACC :)