mang_dev
맹꽁거리는 개발자
mang_dev
전체 방문자
오늘
어제
  • 분류 전체보기 (185)
    • Frontend (2)
      • Next.js (1)
    • Backend (3)
      • GraphQL (2)
    • Book (1)
      • 기타 (1)
    • Old (177)
      • 알고리즘 퍼즐 (1)
      • 백준 (131)
      • 프로그래머스 (0)
      • Codility (15)
      • LeetCode (7)
      • Codewars (1)
      • Codeforces (0)
      • Django (6)
      • React (2)
      • Naver Map Api (3)
      • Web UI (4)
      • Introduction to Cloud (2)
hELLO · Designed By 정상우.
mang_dev

맹꽁거리는 개발자

백준 9663번 N-Queen // C++
Old/백준

백준 9663번 N-Queen // C++

2020. 4. 22. 22:18

문제

 

N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다.

N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다. (1 ≤ N < 15)

출력

첫째 줄에 퀸 N개를 서로 공격할 수 없게 놓는 경우의 수를 출력한다.

 


 

풀이

 

N-Queen 문제는 대표적인 Back Tracking 문제이다.

 

체스에서 Queen은 가로, 세로, 대각선 중 원하는 방향으로 쭉 움직일 수 있다.

초록색과 같은 위치에 Queen이 놓이게 되면, 파란색으로 칠해진 가로 세로 대각선 방향에는 다른 Queen을 놓을 수 없게 된다.

 

이 때, Queen을 n개만큼 놓을 수 있는 경우의 수를 모두 출력하면 된다.

 

dfs와 비슷한 느낌으로 풀면 되는데, 이 때까지 놓인 모든 Queen과 하나씩 비교하면서 같은 방향이 아닌 경우에만 하나씩 추가하면서 n개가 되면 카운트 해주면 된다.


 

코드

더보기
#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

int n; // board size
vector<pair<int, int>> v; // queen's location
int ans = 0;

void nQueen(int num);

int main() {
	cin >> n;

	nQueen(0);

	cout << ans;
}

void nQueen(int num) {
	if (num == n) {
		ans++;
		return;
	}

	vector<pair<int, int>> temp = v;
	bool check;

	for (int i = 0; i < n; i++) {
		check = true;
		for (int j = 0; j < temp.size(); j++) {
			int x = temp[j].first;
			int y = temp[j].second;

			if ((x == i) || (y == num) || (abs(x - i) == abs(y - num))) { // 가로가 같거나 || 세로가 같거나 || 대각선이 같은 경우
				check = false;
					break;
			}
		}

		if (check) {
			v.push_back(make_pair(i, num));
			nQueen(num + 1);
			v.pop_back();
		}
	}
}
저작자표시 (새창열림)

'Old > 백준' 카테고리의 다른 글

백준 2110번 공유기 설치 // C++  (0) 2020.05.12
백준 2485번 가로수 // C++  (0) 2020.04.22
백준 10867번 중복 빼고 정렬하기 // C++  (0) 2020.04.22
백준 1406번 에디터 // C++  (0) 2020.04.22
백준 16397번 탈출 // C++  (0) 2020.03.18
    'Old/백준' 카테고리의 다른 글
    • 백준 2110번 공유기 설치 // C++
    • 백준 2485번 가로수 // C++
    • 백준 10867번 중복 빼고 정렬하기 // C++
    • 백준 1406번 에디터 // C++
    mang_dev
    mang_dev

    티스토리툴바