N

(프로그래머스 c++) N-Queen 본문

프로그래머스 알고리즘/3단계

(프로그래머스 c++) N-Queen

naeunchan 2020. 9. 21. 12:25
728x90
반응형

문제 설명

가로, 세로 길이가 n인 정사각형으로된 체스판이 있습니다. 체스판 위의 n개의 퀸이 서로를 공격할 수 없도록 배치하고 싶습니다.

예를 들어서 n이 4인경우 다음과 같이 퀸을 배치하면 n개의 퀸은 서로를 한번에 공격 할 수 없습니다.

 

체스판의 가로 세로의 세로의 길이 n이 매개변수로 주어질 때, n개의 퀸이 조건에 만족 하도록 배치할 수 있는 방법의 수를 return하는 solution함수를 완성해주세요.

제한사항

  • 퀸(Queen)은 가로, 세로, 대각선으로 이동할 수 있습니다.
  • n은 12이하의 자연수 입니다.

 

DFS로 문제 풀이.

퀸이 움직이는 방향을 모두 검사하면서 카운트를 세어주면 된다.

상하좌우, 대각선을 모두 검사하는 함수를 만들어서 dfs를 진행하면 된다.

#include <string>
#include <vector>

using namespace std;
bool check[12][12] = {false, };
int answer = 0;

void dfs(int n, int row, int column, int queen);
bool isTrue(int n, int row, int column);

int solution(int n) {
    dfs(n, 0, 0, 0);
    
    return answer;
}

void dfs(int n, int row, int column, int queen)
{
    if(queen == n)
    {
        answer++;
        return;
    }
    
    for(int j = 0; j < n; j++)
    {
        if(isTrue(n, row, j))
        {
            check[row][j] = true;
            dfs(n, row + 1, j, queen + 1);
            check[row][j] = false;
        }
    }
}

bool isTrue(int n, int row, int column)
{
    //가로
    for(int i = 0; i < n; i++)
    {
        if(check[row][i] == true)
            return false;
    }
    
    //세로
    for(int i = 0; i < n; i++)
    {
        if(check[i][column] == true)
            return false;
    }
    
    //우측 상방 대각
    for(int i = row, j = column; i >= 0 && j < n; i--, j++)
    {
        if(check[i][j] == true)
            return false;
    }
    
    //우측 하방 대각
    for(int i = row, j = column; i < n && j < n; i++, j++)
    {
        if(check[i][j] == true)
            return false;
    }
    
    //좌측 상방 대각
    for(int i = row, j = column; i >= 0 && j >= 0; i--, j--)
    {
        if(check[i][j] == true)
            return false;
    }
    
    //좌측 하방 대각
    for(int i = row, j = column; i < n && j >= 0; i++, j--)
    {
        if(check[i][j] == true)
            return false;
    }
    return true;
}
728x90
반응형