Я написал C ++ программу для решения головоломки судоку, она показывает "Исключение произошло. EXC_BAD_ACCESS" - PullRequest
0 голосов
/ 13 апреля 2020

Вот код, который я написал:

#include<iostream>
using namespace std;

int puzzle[9][9]=
{
    {0,5,0,0,6,2,7,0,0},
    {0,0,0,0,0,0,1,0,2},
    {7,0,9,3,0,0,0,0,0},
    {3,0,0,0,8,0,0,0,0},
    {0,8,0,7,0,9,0,2,0},
    {0,0,0,0,5,0,0,0,7},
    {0,0,0,0,0,6,2,0,8},
    {2,0,6,0,0,0,0,0,0},
    {0,0,3,4,2,0,0,9,0},
};//puzzle template

bool row_possible(int row,int number);//To find out whether a number is possible in the particular row

bool column_possible(int column,int number);//To find whether a number is possible in the particular column

bool square_possible(int row,int column,int number);//To find whether a number is possible in its square

bool possible(int row,int column,int number);//To find whether a number is possible in the given position

bool unassigned();//To check whether the puzzle has any unassigned spaces

void printSolution();//To print the final solution to the console

bool solve();//To solve the puzzle

int main()
{
    if(solve())
       printSolution();
    else
       cout<<"\nNo Solution";
return 0;
}
bool row_possible(int row,int number)
{
    int m=0;
    for(int column=0;column<9;column++)
    {
        if(puzzle[row-1][column]==number)
         m++;
    }
    if(m!=0)
        return false;
    else
    {
        return true;
    }

}
bool column_possible(int column,int number)
{
    int m=0;
    for(int row=0;row<9;row++)
    {
        if(puzzle[row][column-1]==number)
           m++;
    }
    if (m!=0)
        return false;
    else
    {
        return true;
    }
}
bool square_possible(int row,int column,int number)
{
    int mod_x=(row-1)%3,mod_y=(column-1)%3;
    int i=(row-1)-mod_x,j=(column-1)-mod_y;
    int m=0;
    int k=0;
    int check_x=3,check_y=3;
    for(k=0;check_x!=0;check_x--)
    {
        for(k=0;check_y!=0;check_y--)
        {
            if(puzzle[i][j]==number)
            m++;
            j++;
        }
        i++;
    }
    if(m!=0)
       return false;
    else
    {
        return true;
    }
}

bool possible(int row,int column,int number)
{
    if(row_possible(row,number)&&column_possible(column,number)&&square_possible(row,column,number))
        return true;
    else
    {
        return false;
    }

}
bool unassigned()
{
    int m=0;
    for(int row=0;row<9;row++)
    {
        for(int column=0;column<9;column++)
        {
            if(puzzle[row][column]==0)
               m++;
        }
    }
    if(m>0)
         return true;
    else
    {
        return false;
    }

}
void printSolution()
{
    for(int i=0;i<9;i++)
    {
        for(int j=0;j<9;j++)
        {
           cout<<puzzle[i][j]<<" ";
        }
        cout<<"\n";
    }

}
bool solve()
{
    if(!unassigned())
        return true;
    for(int row=1;row<10;row++)
    {
        for(int column=1;column<10;column++)
        {
            for(int number=1;number<10;number++)
            {
                if(possible(row,column,number))
                {
                    puzzle[row-1][column-1]=number;
                    if(solve())
                       return true;
                    puzzle[row-1][column-1]=0;
                }
            }
        }
    }
    return false;
}

Отладчик выдает ошибку в:

 int m=0;
 int k=0;
 int check_x=3,check_y=3;

Он говорит Произошло исключение. EXC_BAD_ACCESS . Это также говорит о сбое чтения памяти. Я не понимаю, что он говорит. Позвольте мне также знать, нуждается ли моя программа в каких-либо улучшениях Пожалуйста, помогите мне. Я использую код Visual Studio на MacOS. Спасибо

1 Ответ

1 голос
/ 22 апреля 2020

Вы можете сделать простой расчет того, сколько времени вам потребуется, чтобы получить ответ.

У вас есть 55 открытых ячеек, в которых вы пробуете 9 разных чисел. Это дает вам 9 55 = 3 * 10 52 попыток.

Если одна попытка занимает 1 мкс, это займет ~ 9,6 * 10 38 лет , чтобы найти решение.

Я написал программу на C ++, которая находит решение этой судоку за 30 мс, и мой P C не очень быстрый (5 лет) и 10 мс это используется для вывода решения на экран с printf

...