九宫格数独--回溯法

数独顾名思义——每一个数字只能出现一次。数独是一种源自18世纪末的瑞士,后在美国发展、并在日本得以发扬光大的数字谜题。数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出必定的已知数字和解题条件,利用逻辑和推理,在其余的空格上填入1-9的数字。使1-9每一个数字在每一行、每一列和每一宫中都只出现一次。 这种游戏全面考验作题者观察能力和推理能力,虽然玩法简单,但数字排列方式却变幻无穷,因此很多教育者认为数独是训练头脑的绝佳方式。html

九宫格的游戏在不少地方都常常出现,好比手机,电脑等等,下面就以简单的一个例子来讲明如何使用回溯算法来解决该类问题。下面数组表明最初给出的九宫格,
0为空格须要填的数字。
int[,] pu = new int[9, 9] { {0,0,0,7,2,8,0,0,0}, {0,9,0,0,5,1,6,0,0}, {0,0,0,0,6,0,0,8,2}, {3,0,0,8,0,2,7,0,4}, {1,7,4,0,3,0,0,2,0}, {2,8,0,5,0,0,0,3,0}, {0,1,0,3,0,0,2,0,0}, {0,0,7,0,4,6,0,0,5}, {0,0,6,1,0,0,0,4,9} };
下面使用回溯算法来解决该类问题:
1.验证函数以下:
private bool IsValid(int i, int j) { int n = pu[i,j]; int[] query=new int[9]{0,0,0,3,3,3,6,6,6}; int t, u; for (t = 0; t < 9; t++) { if ((t != i && pu[t, j] == n) || (t != j && pu[i, t] == n)) return false; } for (t = query[i]; t < query[i] + 3; t++) { for (u = query[j]; u < query[j] + 3; u++) { if ((t != i || u != j) && pu[t, u] == n) return false; } } return true; }

2.显示函数:算法

private void Show()
       {
           int n=0; for (var i = 0; i < 9; i++) { for (var j = 0; j < 9; j++) { Console.Write(pu[i, j] + " "); } Console.WriteLine(); } Console.WriteLine("----------------------------------------------"); }

3.使用回溯算法求解:数组

private void Try(int n) { if (n == 81) {//是否已是最后一个格子 Show(); return; } int i = n / 9, j = n % 9; if (pu[i,j] != 0) {//若是当前格子不须要填数字,就跳到下一个格子 Try(n + 1); return; } for (int k = 0; k < 9; k++) { pu[i,j]++;//当前格子进行尝试全部解 if (IsValid(i, j)) Try(n + 1);//验证经过,就继续下一个 } pu[i,j] = 0; //若是上面的单元无解,就回溯 } 

4.调用以下:函数

public void Test()
        {
            Show();
            Try(0);            
        }

实际在游戏中会有不一样的游戏级别如:post

低级:要求至少有一行或一列出题时已填上5个数据,其余能够随机安排,可是每行或每列必须有数据  
中级:要求至少有一行或一列出题时已填上4个数据,其余能够随机安排,可是每行或每列必须有数据  
高级:要求至少有一行或一列出题时已填上3个数据,其余能够随机安排,可是每行或每列必须有数据spa

因此实际中咱们使用回溯不是很方便,我说下个人方法:code

1.只要一个九宫格的任意两行,两列所在列有相同的数字,那么这两行,两列交叉后该九宫格就只剩下一格,这个格子就是前面的相同数字。htm

2.使用1的思想,若是一个九宫格任意两行一列,或两列一行所在行列都有相同数字,那么该九宫两行一列交叉后只剩两个格子,若是一个格子游戏已经给出
数字,剩下的格子就是该数字了。blog

3.一次类推,一行一列,0行1列等等。游戏

做者: 生鱼片
本文版权归做者和博客园共有,欢迎转载,但未经做者赞成必须保留此段声明,且在文章页面明显位置给出原文链接,不然保留追究法律责任的权利。
    
相关文章
相关标签/搜索