Fork Copy #include using namespace std; int n,bestDistance,numCus[4],posGate[4], Spot[65]; int Gate[7][4]={0,0,0,0, 0,1,2,3, 0,1,3,2, 0,2,1,3, 0,2,3,1, 0,3,1,2, 0,3,2,1}; void ResetSpot(int igate, int Case){ for(int i=1; i<=n; i++){ for(int j=igate+1; j<=3; j++){ if(Spot[i]==Gate[Case][j]) Spot[i]=0; } } } void Try(int Case,int iGate, int Distance){ if(iGate>3){ if(DistancebestDistance) return; int numCusm=1; int dis=1; for(int i=0; i<=n; i++){ for(int j=-1; j<=1; j+=2){ int pos=posGate[Gate[Case][iGate]]+i*j, pos2=posGate[Gate[Case][iGate]]-i*j; if(numCusm=1 && pos<=n){ Spot[pos]=Gate[Case][iGate]; numCusm++; dis+=i; continue; } else if(numCusm==numCus[Gate[Case][iGate]]){ if(!Spot[pos] && !Spot[pos2] && pos<=n && pos>=1 && pos2<=n && pos2>=1){ /// Ca 2 o cung trong dis+=i; Spot[pos]=Gate[Case][iGate]; Try(Case,iGate+1,Distance+dis); Spot[pos]=0; ResetSpot(iGate,Case); Spot[pos2]=Gate[Case][iGate]; Try(Case,iGate+1,Distance+dis); Spot[pos2]=0; continue; } if(!Spot[pos] && pos<=n && pos>=1){ dis+=i; Spot[pos]=Gate[Case][iGate]; Try(Case,iGate+1,Distance+dis); Spot[pos]=0; continue; } if(!Spot[pos2] && pos2<=n && pos2>=1){ dis+=i; Spot[pos2]=Gate[Case][iGate]; Try(Case,iGate+1,Distance+dis); Spot[pos2]=0; continue; } } } } } int main(){ freopen("input.txt","r",stdin); int T; cin>>T; for(int tc=1; tc<=T; tc++){ bestDistance=999999; cin>>n; cin>>posGate[1]>>numCus[1]>>posGate[2]>>numCus[2]>>posGate[3]>>numCus[3]; for(int i=1; i<=6 ;i++){ Try(i,1,0); } cout<<"Case #"<