自己随便写的数据计算程序,有很多需要完善的地方,只能推算简单数独
//数独--程序.c
/*--数独规则:
* 一个行中不能出现重复的数字
* 一个列中不能出现重复的数字
* 一个九宫格中不能出现重复的数字
#include<stdio.h>
#define N 9
//判断函数
int judge(int a[N][N]) {
int i, j;
for (i = 0; i < 9; i++) { //输入数组
for (j = 0; j < 9; j++) {
if (a[i][j] == 0) {
return 1;
}
}
}
return 0;
}
//判断行函数
void judgerow(int b[N][N][N + 1]) {
int i, j, l, num;
for (i = 0; i < N; i++) { //从0-9行开始判断
for (j = 0; j < N; j++) { //如果数组为0,跳到同行下一列,如果数组的数不为0,将同行的所在k高的值全部变为0;
if (b[i][j][0] != 0) {
num = b[i][j][0];
for (l = 0; l < N; l++) {
b[i][l][num] = 0;
}
}
}
}
}
//判断列函数
void judgecolumn(int b[N][N][N + 1]) {
int i, j, l,num;
for (j = 0; j < N; j++) { //按0-9列开始判断
for (i = 0; i < N; i++) {
if (b[i][j][0] != 0) { //同上
num = b[i][j][0];
for (l = 0; l < N; l++) {
b[l][j][num] = 0;
}
}
}
}
}
//判断九宫格函数
void judgesudoku(int b[N][N][N + 1]) {
int i, j, l, num,n;
int key_i, key_j;
int search_i, search_j;
for (i = 0; i < N; i++) {
if (i == 0 || i == 1 || i == 2) { //寻找key_i
key_i = 1;
}
else if (i == 3 || i == 4 || i == 5) {
key_i = 4;
}
else if (i == 6 || i == 7 || i == 8) {
key_i = 7;
}
for (j = 0; j < N; j++) {
if (j == 0 || j == 1 || j == 2) { //寻找key_j
key_j = 1;
}
else if (j == 3 || j == 4 || j == 5) {
key_j = 4;
}
else if (j == 6 || j == 7 || j == 8) {
key_j = 7;
}
for (search_i = key_i - 1; search_i <= key_i + 1; search_i++) { //进行九宫格判断
for (search_j = key_j - 1; search_j <= key_j + 1; search_j++) {
if (b[i][j][0] != 0) { //同上
num = b[i][j][0];
for (l = key_i - 1; l <= key_i + 1; l++) {
for (n = key_j - 1; n <= key_j + 1; n++) {
b[l][n][num] = 0;
}
}
}
}
}
}
}
}
//寻找函数
void search(int b[N][N][N + 1]) {
int i, j, l, num,sum,x,k;
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
sum = 0;//每次到k统计时,初始化sum;
for (k = 1; k < N + 1; k++) {
if (b[i][j][k] == 0) {
sum++;
}
else {
x = b[i][j][k];
}
}
if (sum == 8) {
b[i][j][0] = x;
}
}
}
}
int main() {
int i,j,k,num,l,n;
int a[N][N];
int b[N][N][N+1];
printf("输入9*9数独:\n");
for (i = 0; i < N; i++) { //输入数组
for (j = 0; j < N; j++) {
scanf_s("%d", &a[i][j]);
}
}
for (i = 0; i < N; i++) { //对三维数组b进行赋值
for (j = 0; j < N; j++) {
b[i][j][0] = a[i][j];
for (k = 1; k <= N; k++) {
if (b[i][j][0] == 0) {//对三维数组的高k进行赋值,如果k=0的数为0,则 1-9赋值1-9
b[i][j][k] = k; //如果k=0的数不为0,则1-9赋值为0
}
else {
num = b[i][j][0];
b[i][j][k] = 0;
b[i][j][num] = num;
}
}
}
}
int cishu = 0;
while (judge(a)) { //判断函数--如果函数中没有了0,则跳出循环,如果有0,继续循环
//判断行
void judgerow(b);
//判断列
void judgecolumn(b);
//判断宫格1.找到关键数组--key_i,key_j,然后九宫格循环
void judgesudoku(b);
//int sum;//定义一个统计0的变量
// int x; //x为给b[i][j][0]赋值的变量
//寻找函数--如果有9个0,原有的数字,不用寻找,如果有8个0,那么剩下的那个数字赋值给b[i][j][0],
void search(b);
//将得到的数据赋值给a
for (i = 0; i < 9; i++) { //输入数组
for (j = 0; j < 9; j++) {
a[i][j] = b[i][j][0];
}
}
cishu++;
}
for (i = 0; i < 9; i++) { //输出答案数组
for (j = 0; j < 9; j++) {
printf("%d ", a[i][j]);
}
printf("\n");
}
printf("一共循环%d次", cishu);
return 0;
}