문제 링크 : www.acmicpc.net/problem/9663
단순 백트래킹 문제다.
그냥 무작정 다 배치한 다음 확인을 하면 n^n이라는 어마어마한 시간복잡도가 나오게 된다.
결국 백트래킹을 사용해야한다.
<전체적인 알고리즘>
1. 한 줄씩 queen을 놓아본다.
2. queen을 놓을 수 없는 상황이오면 바로 돌아간다.(백트래킹)
<전체코드>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | #include<iostream> #include<vector> using namespace std; vector<pair< int , int >> queen; int n; int result = 0; bool can_exist( int x, int y) //해당 위체에 queen놓을 수 있는지 { for ( int i = 0; i < queen.size(); i++) { int x2 = queen[i].first; int y2 = queen[i].second; if (x == x2 || y == y2 || abs (x - x2) == abs (y - y2)) return false ; //대각선이나 직선에 다른 queen이 있으면 존재 불가능, false 반환 } return true ; } void dfs( int x) { if (x < 0) { result++; return ; } for ( int i = 0; i < n; i++) { if (can_exist(x, i)) //놓을 수 있으면 { queen.push_back(make_pair(x, i)); //놓고 dfs(x - 1); //그 다음 줄 ㄱㄱ queen.pop_back(); } } } int main() { cin >> n; dfs(n-1); cout << result << "\n" ; return 0; } |
궁금하신 점은 댓글에 남겨주시면 답변드리겠습니다.
반응형
'백준 사이트 코딩 문제 > 그 외 문제' 카테고리의 다른 글
백준 1753번: 최단경로 (C++) (0) | 2020.11.17 |
---|---|
백준 1717번: 집합의 표현 (C++) (0) | 2020.11.17 |
백준 1167번: 트리의 지름 (C++) (0) | 2020.11.13 |
백준 12865번: 평범한 배낭 (C++) (0) | 2020.11.12 |
백준 7569번: 토마토 (C++) (0) | 2020.09.11 |