用C语言解9×9数独 (亲测可用)(思路分析)
数独,相信大家都不陌生,就像这样:
从几年前就喜欢做数独题目,到现在读大学了,今年寒假期间想回归童年——玩数独。 玩了好几天,突然拍醒自己!想起我是个程序员……为什么不做点该做的事?
用代码来解数独!!!
用的方法是基本的解数独思路,即按每一行每一列以及所在的九宫格,数字不重复的原则依次进行检索。
#include <stdio.h>
#include <stdbool.h>
#include <windows.h>
#pragma warning(disable:4996);
void readMatrix(int array[9][9])
{
int row,
col;
for (row = 0; row < 9; row++)
{
for (col = 0; col < 9; col++)
scanf(" %1d", &array[row][col]);
getchar();
}
}
bool RowAndColRepeat(int array[9][9], int row, int col, int num)
{
int i;
for (i = 0; i < 9; i++)
if (array[row][i] == num)
return false;
for (i = 0; i < 9; i++)
if (array[i][col] == num)
return false;
return true;
}
int getRowOrCol(int num)
{
if (num < 3)
return 0;
else if (num < 6)
return 3;
else
return 6;
}
bool BlockRepeat(int array[9][9], int row, int col, int num)
{
int getRowOrCol(int num);
int rowStart,
colStart,
i, j;
rowStart = getRowOrCol(row);
colStart = getRowOrCol(col);
for (i = rowStart; i < rowStart + 3; i++)
for (j = colStart; j < colStart + 3; j++)
if (array[i][j] == num)
return false;
return true;
}
void calculation(int array[9][9], int row, int col)
{
int i, j;
if (row > 8)
{
for (i = 0; i < 9; i++)
{
for (j = 0; j < 9; j++)
printf("%d ", array[i][j]);
printf("\n");
}
return;
}
if (array[row][col] == 0)
{
for (i = 1; i < 10; i++)
if (RowAndColRepeat(array, row, col, i) && BlockRepeat(array, row, col, i))
{
array[row][col] = i;
calculation(array, row + (col + 1) / 9, (col + 1) % 9);
}
array[row][col] = 0;
}
else
{
calculation(array, row + (col + 1) / 9, (col + 1) % 9);
}
}
int main()
{
int array[9][9];
printf("请输入题目:\n");
readMatrix(array);
printf("\n计算结果:\n");
calculation(array, 0, 0);
system("pause");
return 0;
}
效果如下:
接着就是动动手,把答案写进题目里面啦!!
大家还有更好的方法,欢迎评论区讨论~~
|