programmers

[Programmers]연습문제>N-Queen + N차원 벡터 초기화 방법

윤만석 2022. 9. 1. 16:59

문제 설명

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

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

 

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

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

 

level2 백트래킹 문제입니다.

0부터n행까지 퀸을 하나씩 가능한 위치에 둡니다

#include <string>
#include <vector>

using namespace std;
int answer = 0;
int N;
int dy[4]={-1,1,1,-1};
int dx[4]={1,1,-1,-1};

void Queen(int y,int x,vector<vector<int>>&tmp){
    for(int i=0;i<N;i++){
        tmp[y][i]=-1;
        tmp[i][x]=-1;
        for(int j=0;j<4;j++){
            int ny=y+dy[j]*(i+1);
            int nx=x+dx[j]*(i+1);
            if(ny>=0 && ny<N && nx>=0 && nx<N){
            tmp[ny][nx]=-1;
            }
        }
    }
}
void bt(int k,vector<vector<int>>mp){
    if(k==N){
        answer++;
        return;
    }
    for(int i=0;i<N;i++){
        if(mp[k][i]!=-1){
            vector<vector<int>>temp=mp;
            Queen(k,i,temp);
            bt(k+1,temp);
        }
    }
}
int solution(int n) {
    N=n;
    vector<vector<int>> mp(n, vector<int>(n,0));
    bt(0,mp);
    return answer;
}

 

1차원 벡터의 초기화 방법은 다음과 같습니다

N크기의 벡터를 0으로 초기화

vector<int>A(n,0); 

 

 

2차원 벡터의 초기화 방법은 다음과 같습니다

M*N크기의 벡터를 0으로 초기화

vector<vector<int>>A(M,vector<int>(N,0))