用了一点简单的回溯就可以建立一个数独Grid了, 算法并不复杂, 效率也很不错哦.
求解一个数独其实也可以用回溯搞定.

using System;
using System.Collections.Generic;
using System.Text;

namespace Adrian.Sudoku
{
    
public class SudokuDataGenerator
    {
        
public static SudokuData New()
        {
            SudokuData dt 
= new SudokuData();
            Random ran 
= new Random();
            
// data stores in "grid:int[,]"
            int[,] grid = dt.Data;
            
// stores data for backtracking
            List<int>[,] used = new List<int>[99];
            
int i = 0;
            
int j = 0;
            
for (i = 0; i < 9; i++)
            {
                
for (j = 0; j < 9; j++)
                {
                    used[i, j] 
= new List<int>();
                }
            }

            
for (i = 0; i < 9; i++)
            {
                
for (j = 0; j < 9; j++)
                {
                    
bool ok = false;
                    
// used numbers of current cell
                    List<int> curUsed = used[i, j];
                    
while (!ok && curUsed.Count < 9)
                    {
                        
int posValue = ran.Next(110);
                        
// find an unused number
                        while (curUsed.Contains(posValue))
                        {
                            posValue 
= ran.Next(110);
                        }

                        
// satisfy the constraint?
                        ok = Check(grid, i, j, posValue);
                        
if (ok)
                        {
                            grid[i, j] 
= posValue;
                        }
                        curUsed.Add(posValue);
                    }
                    
// used up 1~9
                    if (!ok)
                    {
                        
// backtracking
                        
// go back to the last cell and try the rest numbers
                        curUsed.Clear();
                        
if (j > 0)
                        {
                            j 
-= 2;
                            grid[i, j 
+ 1= 0;
                        }
                        
else
                        {
                            i
--;
                            j 
= 7;
                            grid[i, 
8= 0;
                        }
                    }
                }
            }
            
return dt;
        }

        
private static bool Check(int[,] grid, int row, int col, int possibleValue)
        {
            
int i = 0;
            
int j = 0;
            
// check column
            for (i = 0; i < 9; i++)
            {
                
if (grid[row, i] == possibleValue)
                {
                    
return false;
                }
            }
            
// check row
            for (j = 0; j < 9; j++)
            {
                
if (grid[j, col] == possibleValue)
                {
                    
return false;
                }
            }
            
// check 3*3 child grid
            int rowStart = (row - row % 3);
            
int colStart = (col - col % 3);
            
for (i = rowStart; i < rowStart + 3; i++)
            {
                
for (j = colStart; j < colStart + 3; j++)
                {
                    
if (grid[i, j] == possibleValue)
                    {
                        
return false;
                    }
                }
            }
            
return true;
        }
    }
}

参考:
Sudoku Generator
A Sudoku Solver in C
Sudoku-Help Difficulty (SHD) Rating
Minimum Sudoku
Posted on 2007-03-08 22:14 Adrian H. 阅读(2495) 评论(7)  编辑 收藏 网摘 所属分类: Algorithm

Feedback

#1楼    回复  引用    

2007-07-22 09:42 by 太累了 [未注册用户]
楼主有关于文件导入导出的代码吗、、
特别是该数独中的
binghelanhuo@tom.com

#2楼    回复  引用    

2007-10-24 12:08 by sudoku [未注册用户]
非常不错,学习了

#3楼    回复  引用    

2008-01-29 22:28 by damnit [未注册用户]
你确定这段代码能用?SudokuData 类的定义在哪里呢?

#4楼    回复  引用    

2008-01-31 12:00 by adrianHuang [未注册用户]
@damnit
显然,SudokuData里面只是一个二维数组。

#5楼    回复  引用    

2008-02-15 23:48 by a308603129 [未注册用户]
哪里有回溯的体现呢
我怎么看像是枚举?

#6楼    回复  引用    

2008-02-16 19:16 by ricky…… [未注册用户]
好像不同的名字,都差不多的方法啊!

#7楼    回复  引用    

2008-11-20 14:29 by iamwiki [未注册用户]
能实现全部的5,472,730,538种 局面么?

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-02-17 12:40 编辑过
Google站内搜索


China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!

相关文章:

相关链接: