1일1알

백준 3967번 매직 스타 C++ 본문

알고리즘

백준 3967번 매직 스타 C++

영춘권의달인 2023. 4. 14. 17:10

https://www.acmicpc.net/problem/3967

 

3967번: 매직 스타

매직 스타의 모양이 주어진다. 수가 채워져 있지 않은 곳은 x로, 채워져 있는 곳은 'A'부터 'L'까지 알파벳으로 채워져 있다. i번째 알파벳은 숫자 i를 의미한다. '.'는 매직 스타의 형태를 만들기

www.acmicpc.net

 

백트래킹

 

#include <iostream>
#include <string>
#include <vector>
#include <math.h>
#include <algorithm>
#include <utility>
#include <stack>
#include <queue>
#include <math.h>
#include <set>
#include <map>
#include <list>
#include <unordered_map>
#include <unordered_set>
#include <iomanip>
#include <limits.h>

using namespace std;
using int64 = long long;

int cnt = 0;
vector<bool> used(12, false);
vector<int> _fill;
vector<pair<int, int>> pos(12);
vector<vector<char>> board(5, vector<char>(9));

void BT(int idx, int currCnt) {
    if (currCnt == cnt) {
        int sum1, sum2, sum3, sum4, sum5, sum6;
        sum1 = board[0][4] + board[1][3] + board[2][2] + board[3][1];
        sum2 = board[0][4] + board[1][5] + board[2][6] + board[3][7];
        sum3 = board[3][1] + board[3][3] + board[3][5] + board[3][7];
        sum4 = board[1][1] + board[1][3] + board[1][5] + board[1][7];
        sum5 = board[1][1] + board[2][2] + board[3][3] + board[4][4];
        sum6 = board[1][7] + board[2][6] + board[3][5] + board[4][4];
        bool ans = true;
        if (sum1 != sum2) ans = false;
        if (sum2 != sum3) ans = false;
        if (sum3 != sum4) ans = false;
        if (sum4 != sum5) ans = false;
        if (sum5 != sum6) ans = false;
        if (ans) {
            for (auto a : board) {
                for (auto b : a) {
                    cout << b;
                }
                cout << "\n";
            }
            exit(0);
        }
        return;
    }
    for (int i = 0; i < 12; i++) {
        if (used[i]) continue;
        used[i] = true;
        board[pos[_fill[idx]].first][pos[_fill[idx]].second] = i + 'A';
        BT(idx + 1, currCnt + 1);
        used[i] = false;
        board[pos[_fill[idx]].first][pos[_fill[idx]].second] = 'x';
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int idx = 0;
    for (int i = 0; i < 5; i++) {
        string str;
        cin >> str;
        for (int j = 0; j < str.length(); j++) {
            board[i][j] = str[j];
            if (board[i][j] == '.') continue;
            if (board[i][j] == 'x') {
                _fill.push_back(idx);
                cnt++;
            }
            else {
                used[str[j] - 'A'] = true;
            }
            pos[idx++] = { i,j };
        }
    }
    BT(0,0);
}