数独游戏局的建立算法 (Sudoku Generating Algorithm Using Backtracking)
2007-03-08 22:14
399 查看
用了一点简单的回溯就可以建立一个数独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>[9, 9];
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(1, 10);
// find an unused number
while (curUsed.Contains(posValue))
{
posValue = ran.Next(1, 10);
}
// 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
求解一个数独其实也可以用回溯搞定.
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>[9, 9];
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(1, 10);
// find an unused number
while (curUsed.Contains(posValue))
{
posValue = ran.Next(1, 10);
}
// 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
相关文章推荐
- The backtracking algorithm
- Backtracking Algorithm
- 计算机视觉 之 在iOS上测试跟踪算法Visual Object Tracking Algorithm
- Principles of training multi-layer neural network using backpropagation 使用后向传播算法训练多层神经网络的规则
- Face Detection and Tracking Using the KLT Algorithm
- solve 3*3 magic square problem using recursive backtracking(using Stanford CS106b ADT library)
- Sudoku Solver Backtracking
- Sudoku backtracking with one dimension array
- Optimization of BackTracking algorithm for n queen problem
- Face Detection and Tracking Using the KLT Algorithm
- Blob tracking algorithm(Blob 算法简介)
- A Fast Single Image Haze Removal Algorithm Using Color Attenuation Prior——基于颜色衰减先验单图片去雾算法原理
- The BackTracking algorithm for n queen problem
- (Leetcode)39&40. Combination Sum--Using Backtracking
- 跟踪算法之一_《Robust fragments-based tracking using the integral histogram》阅读心得
- backtracking in Date Structures and Algorithm Analysis in C
- The backtracking algorithm
- PWP(Visual Tracking Tracking using Pixel-Wise Posteriors)跟踪算法研究
- backtracking 算法讲解
- (第八周项目1)建立顺序串的算法库