具有递归回溯返回错误的c数独解算器
大家好,所以我用C写了一个数独解算器,它使用递归回溯。但是,输出不是预期的。要使代码正常工作,需要传入一个81个数字的数组,并且板上的0等于数组中的“.”。问题是我的输出开始用1代替“.”填充所有内容。我不明白为什么,我需要一双新的眼睛来帮我检查一下具有递归回溯返回错误的c数独解算器,c,recursion,sudoku,backtracking,solver,C,Recursion,Sudoku,Backtracking,Solver,大家好,所以我用C写了一个数独解算器,它使用递归回溯。但是,输出不是预期的。要使代码正常工作,需要传入一个81个数字的数组,并且板上的0等于数组中的“.”。问题是我的输出开始用1代替“.”填充所有内容。我不明白为什么,我需要一双新的眼睛来帮我检查一下 #define DEBUG FALSE #define TRUE 1 #define FALSE 0 #include <stdio.h> /* function declarations */ int readPuzzle(int
#define DEBUG FALSE
#define TRUE 1
#define FALSE 0
#include <stdio.h>
/* function declarations */
int readPuzzle(int puzzle[9][9]);
int findRowErrors(int puzzle[9][9]);
int findColErrors(int puzzle[9][9]);
int findBoxErrors(int puzzle[9][9]);
int solvePuzzle(int puzzle[9][9], int index);
int validMove(int puzzle[9][9], int index, int num);
int noSolution(int puzzle[9][9]);
void writePuzzle(int puzzle[9][9]);
int main (void)
{
int puzzle[9][9];
int index = 0;
int error;
while ((error = readPuzzle(puzzle)) != EOF)
{
error += findRowErrors(puzzle);
error += findColErrors(puzzle);
error += findBoxErrors(puzzle);
if (error) printf("Error\n\n");
else
{
/* in DEBUG mode, show initial puzzle in standard sudoku form */
if (DEBUG) writePuzzle(puzzle);
solvePuzzle(puzzle, index);
if (!noSolution(puzzle)) writePuzzle(puzzle);
}
}
return 0;
}
int readPuzzle(int puzzle[9][9])
{
int i, num, row, col;
int error = FALSE;
for (i = 0; (num = getchar()) != '\n'; i++)
{
if (num == EOF) return EOF;
putchar(num);
if ((num < '1' || num > '9') && (num != '.')) error = TRUE;
if (num == '.') num = '0';
row = (i / 9) % 9;
col = i % 9;
puzzle[row][col] = num - '0';
}
putchar('\n');
if (i != 81) error = TRUE;
return error;
}
int findRowErrors(int puzzle[9][9])
{
int row, col, i;
/* check rows */
for (row = 0; row < 9; row++)
{
for (col = 0; col < 9; col++)
{
for (i = col + 1; i < 9; i++)
{
if ( (puzzle[row][col] != 0) && (puzzle[row][col] == puzzle[row][i]) )
{
return TRUE; /* row error found in puzzle\
*/
}
}
}
}
return FALSE;
}
int findColErrors(int puzzle[9][9])
{
int row, col, i;
for (col = 0; col < 9; col++)
{
for (row = 0; row < 9; row++)
{
for (i = row + 1; i < 9; i++)
{
if ( (puzzle[row][col] != 0) && (puzzle[row][col] == puzzle[i][col]) )
{
return TRUE; /* column error found in puzzle */
}
}
}
}
return FALSE;
}
int findBoxErrors(int puzzle[9][9])
{
int row, col, i, j;
for (row = 0; row < 9; row += 3)
{
for (col = 0; col < 9; col += 3)
{
for (i = 0; i < 9; i++)
{
for (j = i + 1; j < 9; j++)
{
if ( (puzzle[row + i / 3][col + i % 3] != 0) &&
(puzzle[row + i / 3][col + i % 3] ==
puzzle[row + j / 3][col + j % 3]) )
{
return TRUE; /* box error found in puzzle*/
}
}
}
}
}
return FALSE;
}
int noSolution(int puzzle[9][9])
{
int row, col;
for (row = 0; row < 9; row++)
{
for (col = 0; col < 9; col++)
{
if (!puzzle[row][col])
{
printf("No solution\n\n");
return TRUE;
}
}
}
return FALSE;
}
void writePuzzle(int puzzle[9][9])
{
int row, col;
for (row = 0; row < 9; row++)
{
if (DEBUG) printf("\n");
if ((DEBUG) && (row == 3 || row == 6))
{
printf("----------------------\n");
}
for (col = 0; col < 9; col++)
{
if (DEBUG) printf(" ");
if (puzzle[row][col]) printf("%d", puzzle[row][col]);
else printf(".");
if ((DEBUG) && (col == 2 || col == 5)) printf(" |");
}
}
printf("\n\n");
}
int solvePuzzle(int puzzle[9][9], int index)
{
int num;
int row = index / 9;
int col = index % 9;
if (index == 81) return TRUE; /* all cells are filled */
if (puzzle[row][col] != 0)
{
return solvePuzzle(puzzle, ++index); /* recursive call */
}
else
{
for (num = 1; num <= 9; num++)
{
if (validMove(puzzle, index, num))
{
puzzle[row][col] = num;
if (solvePuzzle(puzzle, index)) return TRUE;
puzzle[row][col] = 0;
}
}
return FALSE;
}
}
/*Checks to see Valid moves for rows, columns, and regions*/
int validMove(int puzzle[9][9],int start, int num)
{
int r, c;
int row = start / 9;
int column = start % 9;
int regionFirstRow = row - (row %3 );
int regionFirstColumn = column - (row % 3);
/*Checks rows for valid moves*/
for(c = 0; c < 9; c++)
{
if(puzzle[row][c] == num)
{
return FALSE;
}
}
/*Checks columns for valid moves*/
for(r = 0; r < 9; r++)
{
if(puzzle[r][column] == num)
{
return FALSE;
}
}
/*FINISH THIS!!!!!!!!!*/
/*Checks each 3x3 region for valid moves*/
for(r = 0; r < 3; r++)
{
for(c = 0; c < 3; c++)
{
if(puzzle[regionFirstRow + r][regionFirstColumn + c] == num)
{
return FALSE;
}
}
}
return TRUE;
}
}
#定义调试错误
#定义真1
#定义FALSE 0
#包括
/*函数声明*/
智力智力智力测验(智力智力智力测验[9][9]);
int FindRowers(int拼图[9][9]);
int-findcollers(int-puzzle[9][9]);
int findBoxErrors(int puzzle[9][9]);
int-solvePuzzle(int-puzzle[9][9],int-index);
int-validMove(int-puzzle[9][9],int-index,int-num);
int-noSolution(int-puzzle[9][9]);
无效的writePuzzle(int字谜[9][9]);
内部主(空)
{
智力拼图[9][9];
int指数=0;
整数误差;
while((error=readPuzzle(puzzle))!=EOF)
{
错误+=查找错误(拼图);
错误+=查找错误(拼图);
错误+=findBoxErrors(拼图);
if(error)printf(“error\n\n”);
其他的
{
/*在调试模式下,以标准数独形式显示初始谜题*/
if(调试)writePuzzle(拼图);
解谜(谜题、索引);
如果(!noSolution(puzzle))写puzzle(puzzle);
}
}
返回0;
}
智力智力智力测验(智力智力智力测验[9][9])
{
int i,num,row,col;
int error=FALSE;
对于(i=0;(num=getchar())!='\n';i++)
{
如果(num==EOF)返回EOF;
putchar(num);
如果((num<'1'| | num>'9')&&(num!='))错误=TRUE;
如果(num='.')num='0';
行=(i/9)%9;
col=i%9;
拼图[行][col]=num-“0”;
}
putchar('\n');
如果(i!=81)error=TRUE;
返回误差;
}
int FindRowers(int拼图[9][9])
{
int row,col,i;
/*检查行*/
用于(行=0;行<9;行++)
{
用于(列=0;列<9;列++)
{
对于(i=col+1;i<9;i++)
{
if((拼图[行][col]!=0)和&(拼图[行][col]==拼图[行][i]))
{
返回TRUE;/*在拼图中发现行错误\
*/
}
}
}
}
返回FALSE;
}
int-findcollers(int-puzzle[9][9])
{
int row,col,i;
用于(列=0;列<9;列++)
{
用于(行=0;行<9;行++)
{
对于(i=行+1;i<9;i++)
{
if((拼图[行][col]!=0)和&(拼图[行][col]==拼图[i][col]))
{
返回TRUE;/*在拼图中发现列错误*/
}
}
}
}
返回FALSE;
}
int-findBoxErrors(int-puzzle[9][9])
{
int row,col,i,j;
对于(行=0;行<9;行+=3)
{
对于(列=0;列<9;列+=3)
{
对于(i=0;i<9;i++)
{
对于(j=i+1;j<9;j++)
{
如果((拼图[row+i/3][col+i%3]!=0)&&
(拼图[row+i/3][col+i%3]==
拼图[row+j/3][col+j%3]))
{
返回TRUE;/*在拼图中发现框错误*/
}
}
}
}
}
返回FALSE;
}
int-noSolution(int-puzzle[9][9])
{
int row,col;
用于(行=0;行<9;行++)
{
用于(列=0;列<9;列++)
{
如果(!拼图[行][列])
{
printf(“无解决方案\n\n”);
返回TRUE;
}
}
}
返回FALSE;
}
void writePuzzle(整数拼图[9][9])
{
int row,col;
用于(行=0;行<9;行++)
{
如果(调试)printf(“\n”);
如果((调试)和&(行==3 | |行==6))
{
printf(“-------------------------\n”);
}
用于(列=0;列<9;列++)
{
如果(调试)printf(“”);
如果(拼图[行][col])printf(“%d”,拼图[行][col]);
else printf(“.”);
如果((调试)和(&(列==2 | |列==5))printf(“|”);
}
}
printf(“\n\n”);
}
int-solvePuzzle(int-puzzle[9][9],int-index)
{
int-num;
int行=索引/9;
int col=索引%9;
如果(索引==81)返回TRUE;/*所有单元格都已填充*/
如果(拼图[行][列]!=0)
{
返回solvePuzzle(puzzle,++索引);/*递归调用*/
}
其他的
{
对于(num=1;num函数validMove
int regionFirstColumn = column - (row % 3);
应该是
int regionFirstColumn = column - (column % 3);
欢迎使用StackOverflow。请阅读并遵循帮助文档中的发布指南。适用于此处。在您发布代码并准确描述问题之前,我们无法有效帮助您。具体而言,您发布的代码挂起(可能正在等待您未提供的输入),并且您无法显示实际和预期的输出。肯定是validMove中的某些内容导致了错误,只是试图找出哪个部分。输入是值得赞赏的NVM我在编译后再次运行了它,并且它工作了!!!!!您太棒了