Untitled
hung
plain_text
a year ago
2.2 kB
16
Indexable
#include <iostream>
using namespace std;
int T, tc, n,min_res, sum_tmp;
int arr[62], loc_door[4], cus[4];
bool chosen[3];
int hoan_vi[4];
int d[2] = {-1,1};
int MIN(int a,int b)
{
if(a>b)
return b;
return a;
}
void reset_mang()
{
for(int i = 0; i < n; i++)
arr[i] = 0;
}
void XepCho(int currDoor, int cur_cus, int sum_dis)
{
if(cur_cus == cus[currDoor])
{
sum_tmp += sum_dis;
return;
}
if(arr[loc_door[currDoor]] == 0)
{
arr[loc_door[currDoor]] = 1;
cur_cus++;
sum_dis++;
}
int k = 1;
while(cur_cus < cus[currDoor])
{
// Neu chi con 1 nguoi, chay ca 2 ben
if(cur_cus == (cus[currDoor]-1) && arr[loc_door[currDoor] - k] == 0
&& arr[loc_door[currDoor] + k] == 0 && loc_door[currDoor] - k >= 0
&& loc_door[currDoor] + k < n)
// Thu sang trai
{
arr[loc_door[currDoor] - k] = 1;
XepCho(currDoor,cur_cus + 1, sum_dis += 1 + k);
arr[loc_door[currDoor] - k] = 0;
//Thu phai
arr[loc_door[currDoor] + k] = 1;
XepCho(currDoor,cur_cus + 1, sum_dis += 1 + k);
arr[loc_door[currDoor] + k] = 0;
return;
}
//Chay phai
if(arr[loc_door[currDoor] + k] == 0 && loc_door[currDoor] + k < n && cur_cus < cus[currDoor])
{
arr[loc_door[currDoor] + k] = 1;
sum_dis += 1 + k;
cur_cus++;
}
if(arr[loc_door[currDoor] - k] == 0 && loc_door[currDoor] - k >= 0 && cur_cus < cus[currDoor])
{
arr[loc_door[currDoor] - k] = 1;
sum_dis += 1 +k;
cur_cus++;
}
k++;
}
XepCho( currDoor, cur_cus, sum_dis);
}
void backtrack(int x)
{
if( x >= 3)
{
sum_tmp = 0;
for(int i = 0; i < 3; i++)
{
XepCho(hoan_vi[i],0,0);
if(sum_tmp >= min_res)
break;
}
min_res = MIN(min_res, sum_tmp);
reset_mang();
}
for(int i = 0; i < 3; i++)
{
if(chosen[i])
continue;
chosen[i] = 1;
hoan_vi[x] = i;
backtrack(x+1);
chosen[i] = 0;
}
}
int main()
{
cin >> T;
for(tc = 1; tc <= T; tc++)
{
cin >> n;
for(int i = 0; i < n; i++)
{
arr[i] = 0;
}
for (int i = 0; i < 3; i++)
{
cin >> loc_door[i] >> cus[i];
}
min_res = 10000000;
backtrack(0);
cout <<"Case #" << tc <<'\n' <<min_res-1 << '\n';
}
return 0;
}Editor is loading...
Leave a Comment