Coding_Test 연습/Programmers

[프로그래머스] (C++) LV2 N-Queen

Codetesing 2022. 6. 11. 14:53

백트래킹으로 유명한 N Queen 문제이다.

풀어봤던것으로 쉽게 풀었다.

#include <string>
#include <vector>

using namespace std;

bool visited[12][12] = { false, };
int out = 0, N;

bool check(int row, int column)
{
    for (int i = 0; i < N; i++)
        if (visited[row][i] == true)
            return false;

    for (int i = 0; i < N; i++)
        if (visited[i][column] == true)
            return false;

    for (int i = row, j = column; i >= 0 && j < N; i--, j++)
        if (visited[i][j] == true)
            return false;

    for (int i = row, j = column; i < N && j < N; i++, j++)
        if (visited[i][j] == true)
            return false;

    for (int i = row, j = column; i >= 0 && j >= 0; i--, j--)
        if (visited[i][j] == true)
            return false;

    for (int i = row, j = column; i < N && j >= 0; i++, j--)
        if (visited[i][j] == true)
            return false;

    return true;
}

void dfs(int row, int column, int queen)
{
    if (queen == N)
    {
        out++;
        return;
    }

    for (int j = 0; j < N; j++)
    {
        if (check(row, j))
        {
            visited[row][j] = true;
            dfs(row + 1, j, queen + 1);
            visited[row][j] = false;
        }
    }
}

int solution(int n) {
    int answer = 0;
    N = n;

    dfs(0, 0, 0);

    answer = out;

    return answer;
}