解决数独

什么是数独

数独(shù dú)是源自18世纪瑞士的一种数学游戏。是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫(3*3)内的数字均含1-9,不重复 [1] 。
数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称“九宫格”。
————百度百科

怎么解数独

带脑子算(手算法)

在我没上大学之前,那就是手算了,一个个数字试着填,填满了即为完成了
显然效率低而且还头疼(0.0)

不带脑子算(复读机式算法)

试着想了一下数独如何用计算机来解,于是结合一下所学
下面这段c++代码编译运行下,把数独盘面输入下就出结果了
我的贡献0%(复读题目+1%),计算机贡献99%,(•ิ_•ิ)

#include <bits/stdc++.h>
#define MS 11
using namespace std;

int flag; 
char smp[MS][MS];
int mp[MS][MS],ans[MS][MS];
int vp_row[MS][MS];
int vp_col[MS][MS];
int vp_cel[4][4][MS];

int change(char c){
	if('1'<=c&&c<='9') return c-'0';
	else return 0;
}

int check(int x,int y,int num){
	int jdg_row = vp_row[x][num];
	int jdg_col = vp_col[y][num];
	int jdg_cel = vp_cel[x/3][y/3][num];
	if(jdg_row||jdg_col||jdg_cel) return 0;
	return 1;
}

void add_or_del_lab(int x,int y,int num,int jdg){
	vp_row[x][num] = jdg;
	vp_col[y][num] = jdg;
	vp_cel[x/3][y/3][num] = jdg;
}

void input_smp(){
	for(int i=0;i<9;i++) gets(smp[i]);
}

void into_mp(){
	for(int i=0;i<9;i++){
		for(int j=0;j<9;j++){
			mp[i][j] = change(smp[i][j]);
			add_or_del_lab(i,j,mp[i][j],1);
		}
	}
}

void solve(int step){

	if(step==9*9){
		flag = 1;
		printf("\n");
		for(int i=0;i<9;i++){
			for(int j=0;j<9;j++){
				printf("%d ",ans[i][j]);
			}
			printf("\n");
		}
		printf("\n");
	}

	if(mp[step/9][step%9]!=0){
		ans[step/9][step%9] = mp[step/9][step%9];
		solve(step+1);
		return;
	}

	for(int i=1;i<=9;i++){
		int now_x = step/9;
		int now_y = step%9;
		if(check(now_x,now_y,i)&&mp[now_x][now_y]==0){
			add_or_del_lab(now_x,now_y,i,1);
			ans[now_x][now_y] = i;
			solve(step+1);
			add_or_del_lab(now_x,now_y,i,0);
		}
	}
}

int main() {
	printf("输入你想解决的数独:\n");
	printf("===================\n");
	printf("注:(9*9)空缺数字用空格代替\n");
	printf("===================\n");
	input_smp();
	into_mp();
	solve(0);
	if(!flag)
		printf("未找到解,请检查输入是否正确合法\n"); 
	return 0;
}

/*

input:

 2 5 9 8
    7  5
19    7
  6  7
 3  8 4
7  95 862
  8  594
  234   6
 74  15  

output:

4 2 7 5 3 9 6 8 1
8 6 3 1 7 4 2 5 9
1 9 5 8 6 2 7 3 4
2 8 6 4 1 7 3 9 5
5 3 9 2 8 6 4 1 7
7 4 1 9 5 3 8 6 2
6 1 8 7 2 5 9 4 3
9 5 2 3 4 8 1 7 6
3 7 4 6 9 1 5 2 8

*/

然后发现网络上早已有了数独求解器(..•˘_˘•..)

复读式解数独有啥用

有利于老年痴呆~

posted @ 2020-06-11 17:06  棉被sunlie  阅读(154)  评论(0)    收藏  举报