N-Queens문제 질문입니당

  • ydk1130
    ydk1130

    1부터 12까지 모든 경우의수를 다해본결과 위키백과에 나온답과 일치합니다.

    답을 올려본 결과 163ms가 나와 시간에 따른 오답은 아닌것 같구요 ㅠ.

    2일동안 Nqueen을 찾아보고 연습해보고 정확히 구현은 했다고 생각했는데

    오답이 나와 마음이 아프고 왜 틀렸는지도 모르겠네요

    아래는 소스코드입니다. (c언어로 구현했습니다.)

    #include <stdio.h>
    
    int promising(int i);
    void queens(int i);
    int abs(int i);
    int N;  //퀸의 숫자 및 체스판의 가로세로길이
    int Count=0;    //배치가능한 수
    int possible[12]={0,};   //체스판의 길이만큼 동적으로 체스판의 퀸이 어디에 위치해있는지 할당받기위한 배열
    int main(void)
    {
        int T;  //TestCase
        scanf("%d",&T);
    
        while(T>0)
        {   
            scanf("%d",&N);
            queens(0);
            printf("%d\n",Count);
            Count=0;
            T--;
        }
    
        return 0;
    }
    void queens(int i)
    {
        int j;
        if(i==N)
        {
            Count++;
        }
        for(j=1;j<=N;j++)
        {
            possible[i]=j;
            if(promising(i))
            {
                queens(i+1);
            }
        }
    }
    int promising(int i)
    {
        int k=0;
        int flag =1;
        while(k<i&&flag==1)
        {
            if(possible[k]==possible[i]||abs(possible[k]-possible[i])==abs(k-i))
                flag = 0;
            k++;
        }
    
        return flag;
    }
    int abs(int i)
    {
        if(i>0)
            return i;
        else
            return -i;
    }
    

    어떤점에 오류가있는지 알려주세요 ㅠ


    8년 전
1개의 댓글이 있습니다.
  • Being
    Being

    possible 배열의 크기와 접근하는 코드들을 살펴 보세요.


    8년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.