Untitled
unknown
plain_text
a year ago
2.1 kB
3
Indexable
#include <iostream> using namespace std; const int MAX_N = 12; const int MAX_CORE = 12; const int dx[4] = {-1, 1, 0, 0}; const int dy[4] = {0, 0, -1, 1}; int N; int board[MAX_N][MAX_N]; int maxConnected, minLength; int coreCount; pair<int, int> cores[MAX_CORE]; void input() { cin >> N; coreCount = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { cin >> board[i][j]; if (board[i][j] == 1 && i > 0 && i < N-1 && j > 0 && j < N-1) { cores[coreCount++] = {i, j}; } } } } bool canConnect(int x, int y, int dir) { x += dx[dir]; y += dy[dir]; while (x >= 0 && x < N && y >= 0 && y < N) { if (board[x][y] != 0) return false; x += dx[dir]; y += dy[dir]; } return true; } int connectCore(int x, int y, int dir, int value) { int length = 0; x += dx[dir]; y += dy[dir]; while (x >= 0 && x < N && y >= 0 && y < N) { board[x][y] = value; length++; x += dx[dir]; y += dy[dir]; } return length; } void dfs(int idx, int connected, int length) { if (idx == coreCount) { if (connected > maxConnected || (connected == maxConnected && length < minLength)) { maxConnected = connected; minLength = length; } return; } int x = cores[idx].first; int y = cores[idx].second; for (int dir = 0; dir < 4; dir++) { if (canConnect(x, y, dir)) { int wireLength = connectCore(x, y, dir, 2); dfs(idx + 1, connected + 1, length + wireLength); connectCore(x, y, dir, 0); } } dfs(idx + 1, connected, length); } void solve() { maxConnected = 0; minLength = 1e9; dfs(0, 0, 0); cout << minLength << endl; } int main() { int T; cin >> T; for (int tc = 1; tc <= T; tc++) { input(); cout << "#" << tc << " "; solve(); } return 0; }
Editor is loading...
Leave a Comment