NQUEEN 질문드립니다.

  • peace729
    peace729

    안녕하세요, NQUEEN 문제를 풀다 어려움이 있어 질문 드립니다.

    재귀호출을 통하여, 답안을 도출하려 하는데요,
    예제에 나온 답안은 도출이 되는데, 제출을 하면 자꾸 오답으로 나타납니다.
    괜찮으시다면 원인을 찾는데 도움을 부탁드리겠습니다.

    소스는 C++ 이며 아래와 같습니다.


    #include < iostream >
    using namespace std;

    static const int SIZE = 12; // 체스맵 사이즈

    class Map // 하나의 체스맵
    {
    public:

    int map[SIZE][SIZE];
    int N;
    
    Map(int N)
    {
        this->N = N;
    }
    
    Map(Map* obj)
    {
        N = obj->N;
    
        for (int i=0; i<N; i++)
        {
            for (int j=0; j<N; j++)
            {
                map[i][j] = obj->map[i][j];
            }
        }
    }
    
    // 체스맵의 x,y 지점에 1로 셋팅
    void setQueen(int x, int y) 
    {
        map[x][y] = 1;
    }

    };

    class Nqeen
    {
    int N;
    int count;

    public:

    Nqeen(int n)
    {
        N = n;
        count = 0;
    }
     // 몇개의 케이스가 있는지 답안을 도출하는 함수
    int getCaseCount()
    {
        if (N == 1)
        {
            return 1;
        }
    
    
        /*int roof = N/2;
        int ret = 0;
    
        for (int i=0; i<roof; i++)
        {
            Map* map = new Map(N);
            map->setQueen(i,0);
            makeMap(map, 1);
        }
        ret = count*2;
    
        if (N%2 == 1)
        {   
            count = 0;
    
            Map* map = new Map(N);
            map->setQueen(N/2+1,0);
            makeMap(map, 1);
    
            ret += count;
        }*/
    
        // 맨 윗줄 N 개에 대해 탐색을 시도
        for (int i=0; i<N; i++)
        {
            Map* map = new Map(N);
            map->setQueen(i,0);  // 맨 윗줄에 퀸을 하나 위치시키고
            makeMap(map, 1);     // 그 다음 줄 탐색(맵을 만든다)
        }
    
        return count;
    }
    
    void makeMap(Map* map, int y)
    {
        bool check;
    
        for (int i=0; i<N; i++) // i는 x좌표
        {
            check = isEnableCheck(map, i, y);   // i,y 에 퀸이 올수 있는지 검사
            if (check == true)
            {
                if (y == N-1)  // 마지막 줄까지 맵을 만들었다면
                {
                    count++;   // 전체 찾은 갯수 ++
                    if (count == N)  // 목표한 갯수만큼 찾았다면
                    {
                        delete map;
                        break;
                    }
                }
                else // 아직 탐색을 더 해야 한다면 (다음줄로 진행)
                {
                    Map* newMap = new Map(map);
                    newMap->setQueen(i, y);
                    makeMap(newMap, y+1);                   
                }
            }   
    
            if (i == N-1) delete map;
        }
    }
    
    
    bool isEnableCheck(Map* map, int x, int y)
    {
        int i,j;
    
        for (i=x+1; i<N; i++)
        {
            if (map->map[i][y] == 1)
            {
                return false;
            }
        }
    
        for (i=x-1; i>=0; i--)
        {
            if (map->map[i][y] == 1)
            {
                return false;
            }
        }
    
        for (i=y+1; i<N; i++)
        {
            if (map->map[x][i] == 1)
            {
                return false;
            }
        }
    
        for (i=y-1; i>=0; i--)
        {
            if (map->map[x][i] == 1)
            {
                return false;
            }
        }
    
        for (i=x+1, j=y+1; i<N && j<N; i++, j++)
        {
            if (map->map[i][j] == 1)
            {
                return false;
            }
        }
    
        for (i=x-1, j=y-1; i>=0 && j>=0; i--, j--)
        {
            if (map->map[i][j] == 1)
            {
                return false;
            }
        }
    
        for (i=x+1, j=y-1; i<N && j>=0; i++, j--)
        {
            if (map->map[i][j] == 1)
            {
                return false;
            }
        }
    
        for (i=x-1, j=y+1; i>=0 && j<N; i--, j++)
        {
            if (map->map[i][j] == 1)
            {
                return false;
            }
        }
    
        return true;
    }

    };

    int main()
    {
    //FILE* f = freopen("input.txt", "r", stdin);

    int i, testcaseCount;
    cin >> testcaseCount;
    
    int N;
    int ret=0;
    for (i=0; i<testcaseCount; i++)
    {
        cin >> N;
        Nqeen obj(N);
        ret = obj.getCaseCount();
        cout << ret << endl;
    }
    
    
    return 0;

    }


    감사합니다.


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

    if (count == N) 이게 무슨 의도의 구문인가요?


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