알고리즘
백준 2784번 가로 세로 퍼즐 C++
영춘권의달인
2023. 1. 24. 14:14
https://www.acmicpc.net/problem/2784
2784번: 가로 세로 퍼즐
6개 단어를 3*3 가로 세로 퍼즐에 놓을 수 없다면 0을 출력한다. 그렇지 않다면, 3개 줄에 퍼즐을 출력한다. 만약 가능한 답이 여러개라면 사전순으로 앞서는 것을 출력한다. 사전순으로 비교를 할
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;
vector<string> v(6);
vector<int> idxs;
vector<bool> visited(6, false);
vector<bool> found;
bool S_ans = false;
void BT(int idx, int cnt) {
if (cnt >= 3) {
if (S_ans) return;
found = vector<bool>(6, false);
for (auto a : idxs) {
found[a] = true;
}
for (int i = 0; i < 3; i++) {
string str = "";
for (auto a : idxs) {
str += v[a][i];
}
for (int i = 0; i < 6; i++) {
if (found[i]) continue;
if (str != v[i]) continue;
found[i] = true;
break;
}
}
bool ans = true;
for (auto a : found) {
if (a) continue;
ans = false;
}
if (ans == true) {
S_ans = true;
for (auto a : idxs) {
cout << v[a] << "\n";
}
}
return;
}
for (int i = 0; i < 6; i++) {
if (visited[i]) continue;
visited[i] = true;
idxs.push_back(i);
BT(i + 1, cnt + 1);
visited[i] = false;
idxs.pop_back();
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
for (int i = 0; i < 6; i++) cin >> v[i];
BT(0, 0);
if (S_ans == false) cout << 0;
}