待完善的数独

自己随便写的数据计算程序,有很多需要完善的地方,只能推算简单数独

//数独--程序.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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值