반응형

문제 링크

 

2580번: 스도쿠

스도쿠는 18세기 스위스 수학자가 만든 '라틴 사각형'이랑 퍼즐에서 유래한 것으로 현재 많은 인기를 누리고 있다. 이 게임은 아래 그림과 같이 가로, 세로 각각 9개씩 총 81개의 작은 칸으로 이루

www.acmicpc.net

 

 

풀이 )

  빈칸에 해당되는 칸을 blank 벡터에 집어 넣는다.

  이후 빈칸을 한 칸씩 1부터 9까지 가능한 숫자를 check( )를 통해 확인하여 집어 넣는다.

  (9까지 모두 불가능하다면, 해당 경우는 종료)

  가능한 경우가 나오면 바로 출력하고 프로그램을 종료하기 위해 blank가 비었을 때 바로 출력하고 exit(0)을 호출한다.

 

#include <iostream>
#include <vector>

using namespace std;

int board[9][9];

bool check(int x, int y, int num){
    for(int r = 0; r < 9; ++r){
        if(board[r][y] == num)
            return false;
    }

    for(int c = 0; c < 9; ++c){
        if(board[x][c] == num)
            return false;
    }

    for(int r = x/3*3; r < x/3*3+3; ++r){
        for(int c = y/3*3; c < y/3*3+3; ++c){
            if(board[r][c] == num)
                return false;
        }
    }
    return true;
}

void dfs(vector<int>& blank){
    if(blank.empty()){
        for(int i = 0; i < 9; ++i){
            for(int j = 0; j < 9; ++j){
                cout << board[i][j];
                if(j == 8)
                    cout << '\n';
                else
                    cout << ' ';
            }
        }
        exit(0);
    }

    int x = blank.back()/10;
    int y = blank.back()%10;
    blank.pop_back();
    for(int i = 1; i < 10; ++i){
        if(!check(x, y, i))
            continue;
        board[x][y] = i;
        dfs(blank);
        board[x][y] = 0;
    }
    blank.push_back(x*10+y);
}

int main(void){
    vector<int> blank;
    for(int i = 0; i < 9; ++i){
        for(int j = 0; j < 9; ++j){
            cin >> board[i][j];
            if(board[i][j] == 0)
                blank.push_back(i*10+j);
        }
    }

    dfs(blank);
}
반응형

'문제풀이 > 백준' 카테고리의 다른 글

[C++] 백준 - 1744 : 수 묶기  (0) 2021.01.15
[C++] 백준 - 1068 : 트리  (0) 2021.01.13
[C++] 백준 - 10942 : 팰린드롬?  (0) 2021.01.13
[C++] 백준 - 11559 : Puyo Puyo  (0) 2021.01.11
[C++] 백준 - 15686 : 치킨 배달  (0) 2021.01.06
반응형

문제 링크

 

9663번: N-Queen

N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.

www.acmicpc.net

 

풀이 )

  첫 행부터 시작해서 각 열에 들어갈 수 있는지(promise) 확인한 후, 들어간 후 다음 행에 대해서도 반복을 해 마지막 행까지 채워 넣는다.

  각 열에 들어갈 수 있는지 확인할 때에는 첫 행에서는 모든 열에 들어갈 수 있으므로 true를 반환하고,

  해당 행에 대해서 위쪽으로 양쪽 대각선과 열을 확인하여 위치할 수 없게 되는 경우 false를 반환한다.

 

#include <iostream>

using namespace std;

int n, ans;
int col[15];

bool promise(int r, int c){
    if(r == 0)
        return true;
    for(int i = 1; i <= r; ++i){
        if(col[r-i] == c || col[r-i] == c-i || col[r-i] == c+i)
            return false;
    }

    return true;
}

void dfs(int row){
    if(row == n){
        ans++;
        return;
    }
    for(int i = 0; i < n; ++i){
        if(!promise(row, i))
            continue;
        col[row] = i;
        dfs(row+1);
        col[row] = 0;
    }
}

int main(void){
    cin >> n;

    dfs(0);
    cout << ans;
    return 0;
}
반응형

'문제풀이 > 백준' 카테고리의 다른 글

[C++] 백준 - 5373 : 큐빙  (0) 2020.12.09
[C++] 백준 - 14502 : 연구소  (0) 2020.12.09
[C++] 백준 - 1065 : 한수  (0) 2020.12.07
[C++] 백준 - 17144 : 미세먼지 안녕!  (0) 2020.12.07
[C++] 백준 - 14499 : 주사위 굴리기  (0) 2020.12.05

+ Recent posts