반응형
걸린 시간 : NULL
단계별로 풀어보기에서 만난 백트래킹 + 브루트포스 문제이다.
처음에는 체스판 하나하나 다 구현해야하는 줄 알고 4중 for문을 만들었지만 (ㅋㅋㅋ..) 만들면서 대각선 for문 처리할때
같은 대각선에는 x+y나 x-y가 같다는것이 성립하는 것을 알고, 좌측 상승 대각선의 체크리스트를 DLUP, 우측상승 체크리스트를 DRUP로 두고 y축을 t로 넘겨 t와 중복되는 줄, 대각선에 퀸이 있는지 판단후 놓는 식으로 퀸 처리를 마쳤다.
그리고 나올때는 다시 지워주는 식으로 백트래킹까지 구현하여 풀었다.
쉽지만 어려운 문제.
#include <iostream>
#include <set>
#include <vector>
using namespace std;
vector <vector <int>> chess;
vector <int> D1(15,0);
vector <int> DRUP(27,0);
vector <int> DLUP(27,0);
int N;
int cnt = 0;
void queen(int t)
{
if (t == N)
{
cnt++;
return;
}
else
{
for (int i = 0; i < N; i++)
{
if (D1[i] == 0 && DRUP[i + t] == 0 && DLUP[i - t + N - 1] ==0)
{
D1[i] += 1;
DRUP[i+t] += 1;
DLUP[i - t + N - 1] += 1;
queen(t + 1);
D1[i] -= 1;
DRUP[i + t] -= 1;
DLUP[i - t + N - 1] -= 1;
}
}
}
return;
}
int main()
{
int M;
cin >> N;
for (int i = 0; i < N; i++)
{
vector <int> tem(N, 0);
chess.push_back(tem);
}
queen(0);
cout << cnt;
}
반응형
'컴퓨터 > 알고리즘 풀이 (PS) (C++)' 카테고리의 다른 글
[백준 14888번 C++풀이] - 연산자 끼워넣기 (0) | 2023.01.16 |
---|---|
[백준 2580번 C++풀이] - 스도쿠 (0) | 2023.01.16 |
[백준 4195번 C++풀이] - 친구 네트워크 (0) | 2022.08.04 |
[백준 1904번 C++풀이] - 01타일 (0) | 2022.08.01 |
[백준 9184번 C++풀이] 신나는 함수 실행 (0) | 2022.08.01 |