1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
const int Direction[6][3]={1,0,0, -1,0,0, 0,1,0, 0,-1,0, 0,0,1, 0,0,-1};
struct node
{
int x,y,z,face;
};
const int xMax=20;
const int yMax=20;
const int zMax=20;
bool find;
char ch_axis,ch_direction;
int Available[xMax+5][yMax+5][zMax+5];
int i,j,k;
int ans;
int cases;
node inflow,outflow,Max;
int add(node Try)
{
if(Try.x<1||Try.y<1||Try.z<1||Try.x>Max.x||Try.y>Max.y||Try.z>Max.z)
return 1;
Available[Try.x][Try.y][Try.z]++;
if(Available[Try.x][Try.y][Try.z]>1)
return 1;
else
return 0;
}
void del(node Try)
{
if(Try.x<1||Try.y<1||Try.z<1||Try.x>Max.x||Try.y>Max.y||Try.z>Max.z)
return;
Available[Try.x][Try.y][Try.z]--;
}
void search(node now,int deep)
{
int i;
node n1,n2,n3,n4;
if((find && deep==ans) || (!find && deep>ans))
return;
if(now.x==outflow.x && now.y==outflow.y &&now.z==outflow.z &&now.face==outflow.face)
{
find=true;
ans=deep;
return;
}
n1.x=now.x + Direction[now.face][0];n1.y=now.y + Direction[now.face][1];n1.z=now.z + Direction[now.face][2];
n2.x=n1.x + Direction[now.face][0];n2.y=n1.y + Direction[now.face][1];n2.z=n1.z + Direction[now.face][2];
for(i=0;i<6;i++)
if(i/2!=now.face/2)
{
n3.x=n2.x+Direction[i][0];n3.y=n2.y+Direction[i][1];n3.z=n2.z+Direction[i][2];
n4.x=n3.x+Direction[i][0];n4.y=n3.y+Direction[i][1];n4.z=n3.z+Direction[i][2];
n4.face=i;
if(add(n1)+add(n2)+add(n3)+add(n4)==0)
search(n4,deep+1);
del(n1);del(n2);del(n3);del(n4);
}
n1.x&#