数独游戏编程
‘壹’ 查数独游戏规则
我用EXCEL的宏编过,但是算法不太好,简单得可以作出,难得的就不行了 想法如下: 建立一个X(a,b,c,d)的列阵,4个数为(1,2,3)中的一个 a,b表示大的33阵(就是你所说的"区")的位置 c,d表示在特定33阵(特定"区")中的位置 那么每个特定的X表示特定的空格位置 每个X初始都=123456789 X的值表示这个空格可能取的数 然后已经给出的条件的X改为条件给出的数 现在我虽然不知道剩下的空格是哪个数,但是我可以知道特定的空格中不可以是哪个数(按规则) step1 所以分别检查每个空格 将不可能出现的数字从123456789中删去(比如这个区已经存在1,4,5那么我们把区中其他的空格的1,4,5去掉,变成2,3,6,7,8,9) 这样X的位数就越来越小了 当X的长度等于1的时候那么这个空格就是唯一的了 step2 检查每一个区中的9个数中含有几个1,如果只有1个,那么含有1的哪个空格就是1了,(1-9,依次检验),(行或者列也要分别检验) step3 检查是不是每个数都小于10,如果不是 检查经过step1和step2后,各个数字有没有变化,如果有,那么重复step1,step2.没有的话(说明按刚刚的步骤只能解到这样了)结束循环 我编的只是为了方便帮我解题,太难的做不出,但是用的话可以解出很多数了,人在看一下,很快就解出了 如果一定要编到底的话,我也想过 然后在X中寻找1个2位数,假定2位数中的一个是正确的,然后在按刚刚的步骤,如果结果有矛盾则就是另一个数 希望对你有帮助
‘贰’ java高手进,求一个数独游戏java代码
数独(sudoku)的生成与破解
最近在网上比较流行的智力游戏。笔者本人也玩过,可以下个模拟游戏试试,简单的还可以,太难就无从下手了。虽然偶脑子不好使,但偶是计算机科班出身,怕你不成,老规矩,编程破解。
首先,偶是第一次做数独的程序,可能程序不强,以后有时间再改进改进。望高手评析。
还是把数独游戏的规则说一说吧,或许你是刚刚听说这个名字的朋友。数独(sudoku),起源于瑞士,于1970 年代由美国的一家数学逻辑游戏杂志首先发表,当时名为Number Place。及后在日本大力推广下得以发扬光大,于1984 年取名“数独”,即“独立的数字”的省略,在一个9x9的方格中,有81个小方格组成,然后又分9个大块,每块由3x3的方格组成,就是中国的九宫图,大九宫里面再套9个小九宫,共九九八十一个小格子,游戏开始前会有一些格子上写好了数,你需要在剩下的格子里填数,真到把所有格子填满,并且要求,任何一行或一列或者一个小九宫中没有相同的数字,当然你只能用1-9之间的9个数字
以下是java代码,能帮我转换成c++的吗?(转换成功再追加100分,谢谢了。)
Java code public class Sudoku { /** * Print the specified Sudoku problem and its solution. The * problem is encoded as specified in the class documentation * above. * * @param args The command-line arguments encoding the problem. */ public static void main(String[] args) { int[][] matrix = parseProblem(args); writeMatrix(matrix); if (solve(0,0,matrix)) // solves in place writeMatrix(matrix); else System.out.println("NONE"); } static boolean solve(int i, int j, int[][] cells) { if (i == 9) { i = 0; if (++j == 9) return true; } if (cells[i][j] != 0) // skip filled cells return solve(i+1,j,cells); for (int val = 1; val <= 9; ++val) { if (legal(i,j,val,cells)) { cells[i][j] = val; if (solve(i+1,j,cells)) return true; } } cells[i][j] = 0; // reset on backtrack return false; } static boolean legal(int i, int j, int val, int[][] cells) { for (int k = 0; k < 9; ++k) // row if (val == cells[k][j]) return false; for (int k = 0; k < 9; ++k) // col if (val == cells[i][k]) return false; int boxRowOffset = (i / 3)*3; int boxColOffset = (j / 3)*3; for (int k = 0; k < 3; ++k) // box for (int m = 0; m < 3; ++m) if (val == cells[boxRowOffset+k][boxColOffset+m]) return false; return true; // no violations, so it's legal } static int[][] parseProblem(String[] args) { int[][] problem = new int[9][9]; // default 0 vals for (int n = 0; n < args.length; ++n) { int i = Integer.parseInt(args[n].substring(0,1)); int j = Integer.parseInt(args[n].substring(1,2)); int val = Integer.parseInt(args[n].substring(2,3)); problem[i][j] = val; } return problem; } static void writeMatrix(int[][] solution) { for (int i = 0; i < 9; ++i) { if (i % 3 == 0) System.out.println(" -----------------------"); for (int j = 0; j < 9; ++j) { if (j % 3 == 0) System.out.print("| "); System.out.print(solution[i][j] == 0 ? " " : Integer.toString(solution[i][j])); System.out.print(' '); } System.out.println("|"); } System.out.println(" -----------------------"); } } -----------------------
| 4 3 | 7 | 9 8 |
| 5 | 3 | |
| 1 | | 3 |
-----------------------
| 6 | 2 7 | |
| 4 7 | | 1 3 |
| | 5 4 | 9 |
-----------------------
| 2 | | 3 |
| | 5 | 4 |
| 5 4 | 1 | 2 6 |
-----------------------
-----------------------
| 2 4 3 | 7 1 6 | 9 5 8 |
| 9 8 5 | 2 3 4 | 7 1 6 |
| 7 1 6 | 8 9 5 | 3 4 2 |
-----------------------
| 6 3 9 | 1 2 7 | 5 8 4 |
| 4 5 7 | 9 6 8 | 1 2 3 |
| 8 2 1 | 5 4 3 | 6 7 9 |
-----------------------
| 1 6 2 | 4 7 9 | 8 3 5 |
| 3 7 8 | 6 5 2 | 4 9 1 |
| 5 9 4 | 3 8 1 | 2 6 7 |
-----------------------
‘叁’ 基于SAT的数独游戏求解程序,求C语言代码
用0代表要填的数
#include <stdio.h>
#include <stdlib.h>
#define SIZE 9
#define get_low_bit(x) ((~x&(x-1))+1)
struct{
int left;
char num;
char try;
}board[SIZE][SIZE];
int bit2num(int bit)
{
switch(bit){
case 16:
case 256:
return 9;
基础解法
排除法(摒除法)
摒除法:用数字去找单元内唯一可填空格,称为摒除法,数字可填唯一空格称为排除法 (Hidden Single)。
根据不同的作用范围,摒余解可分为下述三种:
数字可填唯一空格在“宫”单元称为宫排除(Hidden Single in Box),也称宫摒除法。
数字可填唯一空格在“行”单元称为行排除法(Hidden Single in Row),也称行摒除法。