문제 링크

C++ (재귀)

#include <bits/stdc++.h>
using namespace std;
bool col[50]; // 퀸 추적 
bool diag1[50] , diag2[50] ;  // 대각선 추적
int n;
int cnt =0;

void search(int y){
  if(y == n){
    cnt++;
    return;
  }
  for(int x=0; x<n; x++){  //n번 반복
    if(col[x] || diag1[x+y] || diag2[x-y+n-1]) continue;
    col[x] = diag1[x+y] = diag2[x-y+n-1] =1;
    search(y+1);
    col[x] = diag1[x+y] = diag2[x-y+n-1] =0;

  }
}
int main(void){
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> n;
  search(0);
  cout << cnt;
}

💡 (수학적인 개념을 요한다. 그냥 받아들이자.)

x+y  는  왼쪽 아래 대각선을 의미한다.  x - y 는 오른쪽 아래 대각선을 의미한다.

따라서 col [] 은 그 좌표의 세로선을 체크하고, diag1[x+y] 는 왼쪽 아래 대각선 체크, 

diag2[x-y+n-1] 은 오른쪽 아래 대각선을 체크한다. 이 때 n-1을 더한것은 인덱스가 음수가 되는 것을 방지한다. 

 

  x →
y
 

 

 

 

 

C++

#include <bits/stdc++.h>
using namespace std;
bool isused1[40]; // column을 차지하고 있는지
bool isused2[40]; // / 방향 대각선을 차지하고 있는지
bool isused3[40]; // \ 방향 대각선을 차지하고 있는지

int cnt = 0;
int n;
void func(int cur) { // cur번째 row에 말을 배치할 예정임
  if (cur == n) { // N개를 놓는데 성공했다면
    cnt++;
    return;
  }
  for (int i = 0; i < n; i++) { // (cur, i)에 퀸을 놓을 예정
    if (isused1[i] || isused2[i+cur] || isused3[cur-i+n-1]) // column이나 대각선 중에 문제가 있다면
      continue;
    isused1[i] = 1;
    isused2[i+cur] = 1;
    isused3[cur-i+n-1] = 1;
    func(cur+1);
    isused1[i] = 0;
    isused2[i+cur] = 0;
    isused3[cur-i+n-1] = 0;
  }
}
int main(void) {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> n;
  func(0);
  cout << cnt;
}
블로그 이미지

hjc_

୧( “̮ )୨

,