Итак, я попытался реализовать судоку с помощью алгоритма поиска с возвратом. Я не понимаю, почему мой код не дает ожидаемого результата.
Что я сделал, так это то, что я создал цикл, в котором он проверяет наличие пустой ячейки (обозначенной 0) в судоку. Когда он его находит, координаты передаются в функцию под названием possibleEntriescheck (). Эта функция записывает в глобально объявленный массив с именем possibleEntries [9] цифры, которые, возможно, могут быть заполнены в ячейке, координаты которой передаются изначально.
Я узнал этот алгоритм из этих видео: https://www.youtube.com/watch?v=NuodN41aK3g https://www.youtube.com/watch?v=QI0diwmx3OY а>
Ожидаемый результат - решенная судоку. Это не работает ожидаемо. Скорее зависает. Небольшая помощь значила бы очень много. Спасибо.
#include <stdio.h>
#include <stdlib.h>
int board[9][9] = {
{3, 0, 6, 5, 0, 8, 4, 0, 0},
{5, 2, 0, 0, 0, 0, 0, 0, 0},
{0, 8, 7, 0, 0, 0, 0, 3, 1},
{0, 0, 3, 0, 1, 0, 0, 8, 0},
{9, 0, 0, 8, 6, 3, 0, 0, 5},
{0, 5, 0, 0, 9, 0, 6, 0, 0},
{1, 3, 0, 0, 0, 0, 2, 5, 0},
{0, 0, 0, 0, 0, 0, 0, 7, 4},
{0, 0, 5, 2, 0, 6, 3, 0, 0},
};
int possibleEntries[9];
void possibleEntriescheck(int i, int j)
{
int x,a=0,k,l,y;
for(x=0;x<9;x++)
possibleEntries[x]=0;
for(x=0;x<9;x++)
{
if(board[i][x]!=0)
possibleEntries[board[i][x]-1]=1;
}
for(x=0;x<9;x++)
{
if(board[x][j]!=0)
possibleEntries[board[x][j]-1]=1;
}
if(i==0 || i==1 || i==2)
k=0;
else if(i==3 || i==4 || i==5)
k=3;
else
k=6;
if(j==0 || j==1 || j==2)
l=0;
else if(j==3 || j==4 || j==5)
l=3;
else
l=6;
for(x=k;x<k+3;x++)
{
for(y=l;y<l+3;y++)
if(board[x][y]!=0)
possibleEntries[board[x][y]-1]=1;
}
for(x=0;x<9;x++)
{
if(possibleEntries[x]==0)
possibleEntries[x]=x+1;
else
possibleEntries[x]=0;
}
}
int isFull()
{
int i,j;
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
if(board[i][j]==0)
return 0;
}
}
return 1;
}
void solveSudoku()
{
int i,j,x,b=0,k;
if(isFull())
{
printf("The sudoku board is:\n");
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
printf("\t%d",board[i][j]);
printf("\n");
}
}
else
{
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
if(board[i][j]==0)
{
possibleEntriescheck(i,j);
for(x=0;x<9;x++)
{
if(possibleEntries[x]!=0)
{
board[i][j]=possibleEntries[x];
solveSudoku();
board[i][j]=0;
}
}
}
}
}
}
return;
}
int main()
{
solveSudoku();
}
possibleEntriescheck()
, описывая каждый шаг функции на английском языке и сопоставив его с тем местом в коде, где это происходит? (Возможно, с комментариями к коду? :)) - person BadZen   schedule 20.02.2018possibleEntries[board[i][x]-1]=1;
что происходит, когдаboard[i][x] ==0
. - person drescherjm   schedule 20.02.2018return
в концеmain
, обычно операторreturn
используется для возврата значения из программы. - person Thomas Matthews   schedule 20.02.2018