[C] nQueen problem .. backtracking

컴퓨터 2009/01/27 14:16 Posted by 반군
  < 문제 >
체스에서 Queen은 가로, 세로, 대각선 방향으로 어느 곳이나 한 번에 움직일 수 있습니다.

 x        x      
   x      x      x
     x    x    x  
       x  x  x    
 x x
 x  x  Q  x  x  x
       x  x  x    
     x    x    x  
   x      x      x
위 표에서 Q에 Queen이 있을 때 x가 Queen이 이동할 수 있는 곳입니다.

N을 입력했을 때, N*N 크기의 체스판에 N개의 Queen을 놓을 때 Queen들이 서로 영향을 줄 수 없는 경우의 수를 출력하는 문제입니다.
N=4일 때 가능한 모든 예를 보겠습니다.

   Q    
       Q
 Q      
     Q  

     Q  
 Q      
       Q
   Q    

▶입력형식 (nqueen.in)
 N (1≤N≤13)
▶출력형식 (nqueen.out)
 N*N의 체스판에서 N개의 Queen들이 서로 영향을 주지 않는 위치로 놓는 방법의 수
▶입력 예
 4
▶출력 예
 2

  < 해법 >
위 문제를 푸는 전략은 기울기를 이용하는 것입니다. N=8일 때의 예를 보겠습니다.

체스판에 위와같이 좌표를 대입합니다. 즉, Q는 (4,3)에 위치하고 있습니다.
그러면 Q가 영향을 줄 수 있는 조건은 다음과 같습니다.

Q와 다른 말인 xx좌표나 y좌표가 같을 때

Q와 다른 말인 x간의 기울기가 ±1일 때입니다.

  < 소스 >
#include <fstream.h>

ofstream out ("nqueen.out");
ifstream in ("nqueen.in");

int n,num=0,map[13];

void find(int x);
int promising(int x);
void main(){
    in>>n;
    int i;
    for(i=0;i<n;i++){
        map[0]=i;
        find(0);
    }
    out<<num;
}
void find(int x){
    int i;
    x++;
    for(i=0;i<n;i++){
        map[x]=i;
        if(promising(x)){
            if(x==n-1) num++;
            else find(x);
        }
    }
}
int promising(int x){
    int i;
    for(i=0;i<x;i++){
        if(map[x]==map[i]||map[x]-map[i]==x-i||map[x]-map[i]==i-x) return 0;
    }
    return 1;
}
저작자 표시 비영리 동일 조건 변경 허락

댓글을 달아 주세요

  1. Kainark 2009/01/27 15:42  댓글주소  수정/삭제  댓글쓰기

    참 별게 다 있어요 ㅇㅅㅇ.

  2. !!!!! 2009/01/27 16:51  댓글주소  수정/삭제  댓글쓰기

    ofstream out
    ifstream in
    << , >>

    주석 도입이 시급합니다.

    • BlogIcon 반군 2009/01/27 17:04  댓글주소  수정/삭제

      ofstream 함수이름 ("출력파일경로");

      ofstream : 파일 출력 함수.
      함수이름 : 출력파일로 출력하는 함수의 이름을 임의로 지정.


      설명하자면
      ofstream out ("output.txt"); 를 쓴 다음부터는
      out << 출력할 내용;
      을 쓰면 output.txt로 출력이 되는거야.

  3. 하느 2009/01/27 17:44  댓글주소  수정/삭제  댓글쓰기

    애시당초 프로그래밍을 모르기 때문에...

  4. BlogIcon 미친과학 2009/01/27 20:50  댓글주소  수정/삭제  댓글쓰기

    저건 귀찮음

  5. BlogIcon 애빨님 2009/01/28 17:19  댓글주소  수정/삭제  댓글쓰기

    뭥미.. 알고리즘?

  6. 소에르 2009/01/29 23:45  댓글주소  수정/삭제  댓글쓰기

    체스는 아는데 프로그래밍을 모르겠다OTL..
    나도 컴퓨터 그래픽말고도 좀 배워보고 싶은데...

    독학한거야? 그렇다면 무서운걸..ㄷㄷㄷㄷ

  7. BlogIcon 뉴런 2009/05/28 22:24  댓글주소  수정/삭제  댓글쓰기

    좋은 코드 감사합니다!