Untitled
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