## 503 - Parallelepiped walk

Moderator: Board moderators

Luchi
New poster
Posts: 3
Joined: Thu Mar 24, 2005 4:33 pm

### 503 - Parallelepiped walk

#include <iostream.h>

int x[3] , x1[3] , x2[3] , a[2] , b[2] , min , sum , saer ;

int main()
{
while(cin>>x[0]>>x[1]>>x[2])
{
cin>>x1[0]>>x1[1]>>x1[2]>>x2[0]>>x2[1]>>x2[2];

if(!x[0]||!x[1]||!x[2])
{min=(x1[0]-x2[0])*(x1[0]-x2[0])+(x1[1]-x2[1])*(x1[1]-x2[1])+(x1[2]-x2[2])*(x1[2]-x2[2]);cout<<min<<'\n';}
else{

if(x1[0]==0) {a[0]=0;a[1]=3;} else if(x1[0]==x[0]) {a[0]=1;a[1]=3;}
else if(x1[1]==0) {a[0]=0;a[1]=2;} else if(x1[1]==x[1]) {a[0]=1;a[1]=2;}
else if(x1[2]==0) {a[0]=0;a[1]=1;} else if(x1[2]==x[2]) {a[0]=1;a[1]=1;}

if(x2[0]==0) {b[0]=0;b[1]=3;} else if(x2[0]==x[0]) {b[0]=1;b[1]=3;}
else if(x2[1]==0) {b[0]=0;b[1]=2;} else if(x2[1]==x[1]) {b[0]=1;b[1]=2;}
else if(x2[2]==0) {b[0]=0;b[1]=1;} else if(x2[2]==x[2]) {b[0]=1;b[1]=1;}

if((a[0]==b[0])&&(a[1]==b[1])) {min=(x1[0]-x2[0])*(x1[0]-x2[0])+(x1[1]-x2[1])*(x1[1]-x2[1])+(x1[2]-x2[2])*(x1[2]-x2[2]);cout<<min<<'\n';}

else {if(b[1]!=a[1])

{
saer=-1*(3-(a[1]+b[1]));

sum=(x1[saer]-x2[saer])*(x1[saer]-x2[saer]);
if(b[0]) if(a[0]) { sum+=(x[a[1]-saer]-x1[a[1]-saer]+x[b[1]-saer]-x2[b[1]-saer])*(x[a[1]-saer]-x1[a[1]-saer]+x[b[1]-saer]-x2[b[1]-saer]);}
else {sum+=(x[a[1]-saer]-x1[a[1]-saer]+x2[b[1]-saer])*(x[a[1]-saer]-x1[a[1]-saer]+x2[b[1]-saer]);}
else if(a[0]) {sum+=(x1[a[1]-saer]+x[b[1]-saer]-x2[b[1]-saer])*(x1[a[1]-saer]+x[b[1]-saer]-x2[b[1]-saer]);}
else {sum+=(x1[a[1]-saer]+x2[b[1]-saer])*(x1[a[1]-saer]+x2[b[1]-saer]);}
min=sum;

if(a[0]) { sum=(x[b[1]-saer]-x2[b[1]-saer]+x[saer]-x1[saer])*(x[b[1]-saer]-x2[b[1]-saer]+x[saer]-x1[saer]);}
else {sum=(x2[b[1]-saer]+x[saer]-x1[saer])*(x2[b[1]-saer]+x[saer]-x1[saer]);}
if(b[0]) { sum+=(x[a[1]-saer]-x1[a[1]-saer]+x[saer]-x2[saer])*(x[a[1]-saer]-x1[a[1]-saer]+x[saer]-x2[saer]);}
else { sum+=(x1[a[1]-saer]+x[saer]-x2[saer])*(x1[a[1]-saer]+x[saer]-x2[saer]);}
if(min>sum) min=sum;

if(a[0]) { sum=(x[b[1]-saer]-x2[b[1]-saer]+x1[saer])*(x[b[1]-saer]-x2[b[1]-saer]+x1[saer]);}
else {sum=(x2[b[1]-saer]+x1[saer])*(x2[b[1]-saer]+x1[saer]);}
if(b[0]) { sum+=(x[a[1]-saer]-x1[a[1]-saer]+x2[saer])*(x[a[1]-saer]-x1[a[1]-saer]+x2[saer]);}
else { sum+=(x1[a[1]-saer]+x2[saer])*(x1[a[1]-saer]+x2[saer]);}
if(min>sum) min=sum;

sum=(x[b[1]-saer]+x[saer]-x1[saer]+x[saer]-x2[saer])*(x[b[1]-saer]+x[saer]-x1[saer]+x[saer]-x2[saer]);
if(b[0]) if(a[0]) sum+=(x[a[1]-saer]-x1[a[1]-saer]+x2[b[1]-saer])*(x[a[1]-saer]-x1[a[1]-saer]+x2[b[1]-saer]);
else sum+=(x[a[1]-saer]-x1[a[1]-saer]+x[b[1]-saer]-x2[b[1]-saer])*(x[a[1]-saer]-x1[a[1]-saer]+x[b[1]-saer]-x2[b[1]-saer]);
else if(a[0]) sum+=(x1[a[1]-saer]+x2[b[1]-saer])*(x1[a[1]-saer]+x2[b[1]-saer]);
else sum+=(x1[a[1]-saer]+x[b[1]-saer]-x2[b[1]-saer])*(x1[a[1]-saer]+x[b[1]-saer]-x2[b[1]-saer]);
if(min>sum) min=sum;

sum=(x[b[1]-saer]+x1[saer]+x2[saer])*(x[b[1]-saer]+x1[saer]+x2[saer]);
if(b[0]) if(a[0]) sum+=(x[a[1]-saer]-x1[a[1]-saer]+x2[b[1]-saer])*(x[a[1]-saer]-x1[a[1]-saer]+x2[b[1]-saer]);
else sum+=(x[a[1]-saer]-x1[a[1]-saer]+x[b[1]-saer]-x2[b[1]-saer])*(x[a[1]-saer]-x1[a[1]-saer]+x[b[1]-saer]-x2[b[1]-saer]);
else if(a[0]) sum+=(x1[a[1]-saer]+x2[b[1]-saer])*(x1[a[1]-saer]+x2[b[1]-saer]);
else sum+=(x1[a[1]-saer]+x[b[1]-saer]-x2[b[1]-saer])*(x1[a[1]-saer]+x[b[1]-saer]-x2[b[1]-saer]);
if(min>sum) min=sum;

sum=a[0];a[0]=b[0];b[0]=sum;sum=a[1];a[1]=b[1];b[1]=sum;sum=x1[0];x1[0]=x2[0];x2[0]=sum;sum=x1[1];x1[1]=x2[1];x2[1]=sum;sum=x1[2];x1[2]=x2[2];x2[2]=sum;

sum=(x[b[1]-saer]+x[saer]-x1[saer]+x[saer]-x2[saer])*(x[b[1]-saer]+x[saer]-x1[saer]+x[saer]-x2[saer]);
if(b[0]) if(a[0]) sum+=(x[a[1]-saer]-x1[a[1]-saer]+x2[b[1]-saer])*(x[a[1]-saer]-x1[a[1]-saer]+x2[b[1]-saer]);
else sum+=(x[a[1]-saer]-x1[a[1]-saer]+x[b[1]-saer]-x2[b[1]-saer])*(x[a[1]-saer]-x1[a[1]-saer]+x[b[1]-saer]-x2[b[1]-saer]);
else if(a[0]) sum+=(x1[a[1]-saer]+x2[b[1]-saer])*(x1[a[1]-saer]+x2[b[1]-saer]);
else sum+=(x1[a[1]-saer]+x[b[1]-saer]-x2[b[1]-saer])*(x1[a[1]-saer]+x[b[1]-saer]-x2[b[1]-saer]);
if(min>sum) min=sum;

sum=(x[b[1]-saer]+x1[saer]+x2[saer])*(x[b[1]-saer]+x1[saer]+x2[saer]);
if(b[0]) if(a[0]) sum+=(x[a[1]-saer]-x1[a[1]-saer]+x2[b[1]-saer])*(x[a[1]-saer]-x1[a[1]-saer]+x2[b[1]-saer]);
else sum+=(x[a[1]-saer]-x1[a[1]-saer]+x[b[1]-saer]-x2[b[1]-saer])*(x[a[1]-saer]-x1[a[1]-saer]+x[b[1]-saer]-x2[b[1]-saer]);
else if(a[0]) sum+=(x1[a[1]-saer]+x2[b[1]-saer])*(x1[a[1]-saer]+x2[b[1]-saer]);
else sum+=(x1[a[1]-saer]+x[b[1]-saer]-x2[b[1]-saer])*(x1[a[1]-saer]+x[b[1]-saer]-x2[b[1]-saer]);
if(min>sum) min=sum;

}

else
{

sum=(x[a[1]%2]-x1[a[1]%2]+x[a[1]%2]-x2[a[1]%2]+x[3-a[1]])*(x[a[1]%2]-x1[a[1]%2]+x[a[1]%2]-x2[a[1]%2]+x[3-a[1]]);
sum+=(x1[a[1]-a[1]%2]-x2[a[1]-a[1]%2])*(x1[a[1]-a[1]%2]-x2[a[1]-a[1]%2]);
min=sum;

sum=(x1[a[1]%2]+x2[a[1]%2]+x[3-a[1]])*(x1[a[1]%2]+x2[a[1]%2]+x[3-a[1]]);
sum+=(x1[a[1]-a[1]%2]-x2[a[1]-a[1]%2])*(x1[a[1]-a[1]%2]-x2[a[1]-a[1]%2]);
if(sum<min) min=sum;

sum=(x[a[1]-a[1]%2]-x1[a[1]-a[1]%2]+x[a[1]-a[1]%2]-x2[a[1]-a[1]%2]+x[3-a[1]])*(x[a[1]-a[1]%2]-x1[a[1]-a[1]%2]+x[a[1]-a[1]%2]-x2[a[1]-a[1]%2]+x[3-a[1]]);
sum+=(x1[a[1]%2]-x2[a[1]%2])*(x1[a[1]%2]-x2[a[1]%2]);
if(sum<min) min=sum;

sum=(x1[a[1]-a[1]%2]+x2[a[1]-a[1]%2]+x[3-a[1]])*(x1[a[1]-a[1]%2]+x2[a[1]-a[1]%2]+x[3-a[1]]);
sum+=(x1[a[1]%2]-x2[a[1]%2])*(x1[a[1]%2]-x2[a[1]%2]);
if(sum<min) min=sum;

sum=(x[a[1]%2]-x1[a[1]%2]+x[a[1]-a[1]%2]-x2[a[1]-a[1]%2]+x[3-a[1]])*(x[a[1]%2]-x1[a[1]%2]+x[a[1]-a[1]%2]-x2[a[1]-a[1]%2]+x[3-a[1]]);
sum+=(x[a[1]-a[1]%2]-x1[a[1]-a[1]%2]+x[a[1]%2]-x2[a[1]%2])*(x[a[1]-a[1]%2]-x1[a[1]-a[1]%2]+x[a[1]%2]-x2[a[1]%2]);
if(sum<min) min=sum;

sum=(x1[a[1]%2]+x[a[1]-a[1]%2]-x2[a[1]-a[1]%2]+x[3-a[1]])*(x1[a[1]%2]+x[a[1]-a[1]%2]-x2[a[1]-a[1]%2]+x[3-a[1]]);
sum+=(x[a[1]-a[1]%2]-x1[a[1]-a[1]%2]+x2[a[1]%2])*(x[a[1]-a[1]%2]-x1[a[1]-a[1]%2]+x2[a[1]%2]);
if(sum<min) min=sum;

sum=(x[a[1]%2]-x1[a[1]%2]+x2[a[1]-a[1]%2]+x[3-a[1]])*(x[a[1]%2]-x1[a[1]%2]+x2[a[1]-a[1]%2]+x[3-a[1]]);
sum+=(x1[a[1]-a[1]%2]+x[a[1]%2]-x2[a[1]%2])*(x1[a[1]-a[1]%2]+x[a[1]%2]-x2[a[1]%2]);
if(sum<min) min=sum;

sum=(x1[a[1]%2]+x2[a[1]-a[1]%2]+x[3-a[1]])*(x1[a[1]%2]+x2[a[1]-a[1]%2]+x[3-a[1]]);
sum+=(x1[a[1]-a[1]%2]+x2[a[1]%2])*(x1[a[1]-a[1]%2]+x2[a[1]%2]);
if(sum<min) min=sum;

sum=(x[a[1]-a[1]%2]-x1[a[1]-a[1]%2]+x[a[1]%2]-x2[a[1]%2]+x[3-a[1]])*(x[a[1]-a[1]%2]-x1[a[1]-a[1]%2]+x[a[1]%2]-x2[a[1]%2]+x[3-a[1]]);
sum+=(x[a[1]%2]-x1[a[1]%2]+x[a[1]-a[1]%2]-x2[a[1]-a[1]%2])*(x[a[1]%2]-x1[a[1]%2]+x[a[1]-a[1]%2]-x2[a[1]-a[1]%2]);
if(sum<min) min=sum;

sum=(x1[a[1]-a[1]%2]+x[a[1]%2]-x2[a[1]%2]+x[3-a[1]])*(x1[a[1]-a[1]%2]+x[a[1]%2]-x2[a[1]%2]+x[3-a[1]]);
sum+=(x[a[1]%2]-x1[a[1]%2]+x2[a[1]-a[1]%2])*(x[a[1]%2]-x1[a[1]%2]+x2[a[1]-a[1]%2]);
if(sum<min) min=sum;

sum=(x[a[1]-a[1]%2]-x1[a[1]-a[1]%2]+x2[a[1]%2]+x[3-a[1]])*(x[a[1]-a[1]%2]-x1[a[1]-a[1]%2]+x2[a[1]%2]+x[3-a[1]]);
sum+=(x1[a[1]%2]+x[a[1]-a[1]%2]-x2[a[1]-a[1]%2])*(x1[a[1]%2]+x[a[1]-a[1]%2]-x2[a[1]-a[1]%2]);
if(sum<min) min=sum;

sum=(x1[a[1]-a[1]%2]+x2[a[1]%2]+x[3-a[1]])*(x1[a[1]-a[1]%2]+x2[a[1]%2]+x[3-a[1]]);
sum+=(x1[a[1]%2]+x2[a[1]-a[1]%2])*(x1[a[1]%2]+x2[a[1]-a[1]%2]);
if(sum<min) min=sum;

}

cout<<min<<'\n';
}
}
}

return 0;

}

metaphysis
Experienced poster
Posts: 139
Joined: Wed May 18, 2011 3:04 pm

### Re: 503 - Parallelepiped walk

Test data generator:

Code: Select all

``````#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main(int argc, char *argv[])
{
srand(time(NULL));

for (int c = 1; c <= 1000; c++)
{
int L = rand() % 1001, W = rand() % 1001, H = rand() % 1001;
int x1, y1, z1, x2, y2, z2;

int plane1 = rand() % 6;
switch (plane1)
{
// top
case 0:
x1 = rand() % (L + 1), y1 = rand() % (W + 1), z1 = H;
break;

// left
case 1:
x1 = rand() % (L + 1), y1 = 0, z1 = rand() % (H + 1);
break;

// right
case 2:
x1 = rand() % (L + 1), y1 = W, z1 = rand() % (H + 1);
break;

// front
case 3:
x1 = L, y1 = rand() % (W + 1), z1 = rand() % (H + 1);
break;

// back
case 4:
x1 = 0, y1 = rand() % (W + 1), z1 = rand() % (H + 1);
break;

// bottom
case 5:
x1 = rand() % (L + 1), y1 = rand() % (W + 1), z1 = 0;
break;
}

int plane2 = rand() % 6;
switch (plane2)
{
// top
case 0:
x2 = rand() % (L + 1), y2 = rand() % (W + 1), z2 = H;
break;

// left
case 1:
x2 = rand() % (L + 1), y2 = 0, z2 = rand() % (H + 1);
break;

// right
case 2:
x2 = rand() % (L + 1), y2 = W, z2 = rand() % (H + 1);
break;

// front
case 3:
x2 = L, y2 = rand() % (W + 1), z2 = rand() % (H + 1);
break;

// back
case 4:
x2 = 0, y2 = rand() % (W + 1), z2 = rand() % (H + 1);
break;

// bottom
case 5:
x2 = rand() % (L + 1), y2 = rand() % (W + 1), z2 = 0;
break;
}

cout << L << ' ' << W << ' ' << H << ' ';
cout << x1 << ' ' << y1 << ' ' << z1 << ' ';
cout << x2 << ' ' << y2 << ' ' << z2 << '\n';
}

return 0;
}
``````