NQUEEN 어떤 오답이 나오는지 모르겠습니다.

  • Hexion
    Hexion

    1부터 12까지 모든 답이
    위키피디아에서 찾아본 답과 동일한데

    어떤 오답이 생기는지 모르겠네요

    이상하게 13만 답이 다르고 14부턴 다시 맞던데
    문제가 12까지만이라 별 상관 없을거 같고..

    #include <iostream>
    using namespace std;
    
    class queentable
    {
    public:
        int** table;
        int size;
        int anscnt;
        void putqueen(int row, int col)
        {
            if (row == 0)
            {
                for (int i = row + 1; i < size; i++)
                    for (int j = 0; j < size; j++)
                        if (table[i][j] == 10 + row)
                            table[i][j] = 99;
            }
            table[row][col] = 55;
            if (row != size - 1)
            {
                for (int i = 0; i < size; i++)
                {
                    if (row + i < size)
                    {
                        if (table[row + i][col + i] == 99)
                            table[row + i][col + i] = 10 + row;
                        if (table[row + i][col] == 99)
                            table[row + i][col] = 10 + row;
                        if (table[row + i][col - i] == 99)
                            table[row + i][col - i] = 10 + row;
                    }
                }
                findplace(row + 1);
            }
            else
            {
                this->anscnt += 1;
            }
            table[row][col] = 99;
        }
        void findplace(int row)
        {
            for (int i = 0; i < size; i++)
            {
                if (table[row][i] == 99)
                {
                    putqueen(row, i);
                    for (int i = row + 1; i < size; i++)
                        for (int j = 0; j < size; j++)
                            if (table[i][j] == 10 + row)
                                table[i][j] = 99;
                }
            }
    
        }
        queentable(int size)
        {
            this->size = size;
            this->anscnt = 0;
            table = (int**)calloc(sizeof(*table), size);
            for (int i = 0; i < size; i++)
                table[i] = (int*)calloc(sizeof(int), size);
            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {
                    table[i][j] = 99;
                }
            }
        }
        ~queentable()
        {
            for (int i = 0; i < size; i++)
                free(table[i]);
            free(table);
        }
        int totalcal()
        {
            for (int i = 0; i < size; i++)
                putqueen(0, i);
    
            return anscnt;
        }
    };
    
    int main()
    {
        int number;
        cin >> number;
        int* numbers;
        numbers = (int*)calloc(sizeof(int), number);
    
        for (int i = 0; i < number; i++)
            cin >> numbers[i];
        for (int i = 0; i < number; i++)
        {
            queentable table(numbers[i]);
            cout << table.totalcal()<<endl;
        }
    }
    

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

    table[][]에 대한 접근이 첨자 범위를 벗어날 수 있습니다.

    이와 같이 어떤 환경에서는 잘 동작하는 것 같은데 다른 환경에서 동작하지 않는 경우, 알고리즘상의 문제보다는 구현상의 실수가 문제가 되는 것이므로 참고하셔서 해결하시면 되겠습니다.


    8년 전 link
  • Hexion
    Hexion

    아아 감사합니다 이게 대체 왜 에러가 안났던거죠...


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