Untitled

 avatar
hung
plain_text
a year ago
2.2 kB
5
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