说到数独,或者九宫格,我想大家一定都不陌生,初中高中看的各种杂志上都有这种益智游戏,现在的智能手机上也有人写出了这种游戏,闲暇时候玩玩也能活跃一下脑子。还有看《模仿游戏》这部电影里面,图灵在选拔队友的时候好像出的也是数独的题目。
我本来对数独不是太感兴趣,但是一个偶然的机会看到朋友在玩这个游戏,就想写出一个破解算法,来在朋友面前炫耀一下,也可以顺便复习一下最近学习的C语言。
数独事实上就是一个9*9的一个方阵,之所以又叫九宫格,是因为其中每3*3的方阵为一宫,整个大方阵有九个这样的宫。规则是在每一行每一列填上1~9九个数字,使得各行各列填满且不重复,并且每一宫中的数字也是1~9不重复。
对于算法来讲,主要使用递归,对于数据结构来讲,用二维数组来表示9*9的方阵,然而每一个位置都有两个属性,即数值和所在的宫,所以一开始我先声明了一个结构体来包含这两个属性。然后用一个分配算法来分配各个位置的数字所在的宫。具体的破解算法其实就是让程序去测试每一个位置该填什么数字,需要判断每一行,每一列,每一宫是否有重复,都没有重复则表示成功。如果成功则保留,不成功则退回重新测试。通过输入原始数据来让程序运行,程序执行后如果有解则输出方阵,如果没有则输出无解。具体程序如下(C语言):
#include<stdio.h>
#include<stdlib.h>
#define _CRT_SECURE_NO_DEPRECATE
#pragma warning(disable:4996)
#define N 9