Untitled
user_5152005
plain_text
6 months ago
8.2 kB
2
Indexable
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <stdio.h> #include <queue> #include <stack> #include <math.h> #include <iomanip> #include <algorithm> #define ROAD 46 #define START 115 #define START_A 115 #define START_B 116 #define FLAG 102 #define FLAG_1 102 #define FLAG_2 103 #define FLAG_3 104 #define FLAG_4 105 #define FLAG_5 106 #define FLAG_6 107 #define FLAG_7 108 #define FLAG_8 109 #define FLAG_9 110 #define FLAG_10 111 #define oo 1000000 using namespace std; int R, C, total_flag; int map[1001][1001]; int visited[1001][1001]; int adj[200][200]; int taken[11]; int flag_r[11]; int flag_c[11]; int start_r_A; int start_c_A; int start_r_B; int start_c_B; int dx[4] = { 0,1,0,-1 }; int dy[4] = { 1,0,-1,0 }; int min_time; int min_diff; int total_flag_A; int total_flag_B; void nhapmap() { int count1 = 0; int count2 = 1; for (size_t i = 1; i <= R; i++) { for (size_t j = 1; j <= C; j++) { char temp; cin >> temp; map[i][j] = (int)temp; if (map[i][j] == START) { if (count1 == 0) { start_r_A = i; start_c_A = j; count1++; } else { start_r_B = i; start_c_B = j; map[i][j] = START_B; } } if (map[i][j] == FLAG) { if (count2 == 1) { flag_r[count2] = i; flag_c[count2] = j; map[i][j] = FLAG_1; count2++; } else if (count2 == 2) { flag_r[count2] = i; flag_c[count2] = j; map[i][j] = FLAG_2; count2++; } else if (count2 == 3) { flag_r[count2] = i; flag_c[count2] = j; map[i][j] = FLAG_3; count2++; } else if (count2 == 4) { flag_r[count2] = i; flag_c[count2] = j; map[i][j] = FLAG_4; count2++; } else if (count2 == 5) { flag_r[count2] = i; flag_c[count2] = j; map[i][j] = FLAG_5; count2++; } else if (count2 == 6) { flag_r[count2] = i; flag_c[count2] = j; map[i][j] = FLAG_6; count2++; } else if (count2 == 7) { flag_r[count2] = i; flag_c[count2] = j; map[i][j] = FLAG_7; count2++; } else if (count2 == 8) { flag_r[count2] = i; flag_c[count2] = j; map[i][j] = FLAG_8; count2++; } else if (count2 == 9) { flag_r[count2] = i; flag_c[count2] = j; map[i][j] = FLAG_9; count2++; } else if (count2 == 10) { flag_r[count2] = i; flag_c[count2] = j; map[i][j] = FLAG_10; count2++; } } } } } int inBound(int a, int b) { if (1 <= a && a <= R && 1 <= b && b <= C) { return 1; } return 0; } void resetVisited() { for (size_t i = 0; i <= R; i++) { for (size_t j = 0; j <= C; j++) { visited[i][j] = 0; } } } void BFS(int start_x, int start_y) { queue<pair<int, int>>q; q.push({ start_x, start_y }); visited[start_x][start_y] = 1; while (!q.empty()) { int old_x = q.front().first; int old_y = q.front().second; q.pop(); for (size_t k = 0; k < 4; k++) { int new_x = old_x + dx[k]; int new_y = old_y + dy[k]; if (visited[new_x][new_y] == 0 && inBound(new_x, new_y)) { visited[new_x][new_y] = 1 + visited[old_x][old_y]; if (map[new_x][new_y] == FLAG_1) { adj[map[start_x][start_y]][FLAG_1] = visited[old_x][old_y]; adj[FLAG_1][map[start_x][start_y]] = visited[old_x][old_y]; } else if (map[new_x][new_y] == FLAG_2) { adj[map[start_x][start_y]][FLAG_2] = visited[old_x][old_y]; adj[FLAG_2][map[start_x][start_y]] = visited[old_x][old_y]; } else if (map[new_x][new_y] == FLAG_3) { adj[map[start_x][start_y]][FLAG_3] = visited[old_x][old_y]; adj[FLAG_3][map[start_x][start_y]] = visited[old_x][old_y]; } else if (map[new_x][new_y] == FLAG_4) { adj[map[start_x][start_y]][FLAG_4] = visited[old_x][old_y]; adj[FLAG_4][map[start_x][start_y]] = visited[old_x][old_y]; } else if (map[new_x][new_y] == FLAG_5) { adj[map[start_x][start_y]][FLAG_5] = visited[old_x][old_y]; adj[FLAG_5][map[start_x][start_y]] = visited[old_x][old_y]; } else if (map[new_x][new_y] == FLAG_6) { adj[map[start_x][start_y]][FLAG_6] = visited[old_x][old_y]; adj[FLAG_6][map[start_x][start_y]] = visited[old_x][old_y]; } else if (map[new_x][new_y] == FLAG_7) { adj[map[start_x][start_y]][FLAG_7] = visited[old_x][old_y]; adj[FLAG_7][map[start_x][start_y]] = visited[old_x][old_y]; } else if (map[new_x][new_y] == FLAG_8) { adj[map[start_x][start_y]][FLAG_8] = visited[old_x][old_y]; adj[FLAG_8][map[start_x][start_y]] = visited[old_x][old_y]; } else if (map[new_x][new_y] == FLAG_9) { adj[map[start_x][start_y]][FLAG_9] = visited[old_x][old_y]; adj[FLAG_9][map[start_x][start_y]] = visited[old_x][old_y]; } else if (map[new_x][new_y] == FLAG_10) { adj[map[start_x][start_y]][FLAG_10] = visited[old_x][old_y]; adj[FLAG_10][map[start_x][start_y]] = visited[old_x][old_y]; } q.push({ new_x,new_y }); } } } } int abs(int x) { return x > 0 ? x : -x; } void backtrack(int taken_flag_A, int taken_flag_B, int last_flag_A, int last_flag_B, int time_of_A, int time_of_B) { if (time_of_A + time_of_B > min_time) { return; } if (time_of_A + time_of_B +adj[last_flag_A][START_A] +adj[last_flag_B][START_B] > min_time) { return; } if (taken_flag_A == total_flag_A && taken_flag_B == total_flag_B) { if (time_of_A + time_of_B + adj[last_flag_A][START_A] + adj[last_flag_B][START_B] == min_time) { min_diff = abs(0 - time_of_A + time_of_B - adj[last_flag_A][START_A] + adj[last_flag_B][START_B]) < min_diff ? abs(0 - time_of_A + time_of_B - adj[last_flag_A][START_A] + adj[last_flag_B][START_B]) : min_diff; } else if (time_of_A + time_of_B + adj[last_flag_A][START_A] + adj[last_flag_B][START_B] < min_time) { min_time = time_of_A + time_of_B + adj[last_flag_A][START_A] + adj[last_flag_B][START_B]; min_diff = abs( 0 - time_of_A + time_of_B - adj[last_flag_A][START_A] + adj[last_flag_B][START_B]); } return; } if (taken_flag_A != total_flag_A) { for (size_t i = 1; i <= total_flag; i++) { if (taken[i] == 0) { taken[i] = 1; backtrack(1 + taken_flag_A, taken_flag_B, map[flag_r[i]][flag_c[i]], last_flag_B, time_of_A + adj[last_flag_A][map[flag_r[i]][flag_c[i]]], time_of_B); taken[i] = 0; } } } if (taken_flag_B != total_flag_B) { for (size_t i = 1; i <= total_flag; i++) { if (taken[i] == 0) { taken[i] = 1; backtrack(taken_flag_A, taken_flag_B + 1, last_flag_A, map[flag_r[i]][flag_c[i]], time_of_A, time_of_B + adj[last_flag_B][map[flag_r[i]][flag_c[i]]]); taken[i] = 0; } } } } void solve() { for (size_t i = 0; i <= total_flag; i++) { //backtrack(); total_flag_B = i; total_flag_A = total_flag - i; backtrack(0, 0, START_A, START_B, 0, 0); } } int main() { freopen("input.txt", "r", stdin); cin >> R >> C >> total_flag; nhapmap(); BFS(start_r_A, start_c_A); resetVisited(); BFS(start_r_B, start_c_B); for (size_t i = 1; i <= total_flag; i++) { resetVisited(); BFS(flag_r[i], flag_c[i]); } min_time = oo; min_diff = oo; solve(); cout << min_time << " " << min_diff; return 0; }
Editor is loading...
Leave a Comment