先看效果
首先是html代码
<!DOCTYPE html>
<html lang="zh-cn" data-ng-app="app">
<head>
<meta http-equiv="Content-" content="text/html; charset=utf-8" />
<title>数独</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
</head>
<body>
<!--jquery-->
<script src="vendor/jquery/jquery-3.1.1.js"></script>
<script>
var pu = [];
$(function () {
for (var i = 0; i < 81; i++) {
$("body").append("<input type='text' class='sd' style='width: 20px; background: red; text-align: center; color: rgb(255, 255, 255);'>")
if((i+1)%9==0)
$("body").append("<br>")
}
$("#send").click(function () {
pu = [];
var sz = [];
for (var i = 0; i < 81; i++) {
var s = $(".sd:eq(" + i + ")").val().trim() == "" ? 0 : parseInt($(".sd:eq(" + i + ")").val().trim());
sz.push(s)
}
$.get("api/sudu?sd=" + sz.join(","), function (data, textStatus) {
console.log(data); // 把返回的数据添加到页面上
var i = 0;
$.each(data, function () {
var j = 0;
$.each(this, function () {
$(".sd:eq(" + (i * 9 + (j++)) + ")").val(this)
});
i++;
});
})
})
$('.sd').bind('input propertychange', function () {
var nxtIdx = $(".sd").index(this) + 1;
$(".sd:eq(" + nxtIdx + ")").focus();
if ($(this).val().trim() != "")
{
$(this).css({ "background": "#fff", "color": "#000" })
}
});
})
</script>
<button id="send" value="计算">计算</button>
<br>
</body>
</html>
再是web.api 代码
using System.Web.Http;
namespace Yi.Web.Controllers
{
public class SuduController : ApiController
{
// GET api/<controller>
int[,] pu = new int[9, 9];
bool cg = false;
public object Get(string sd)
{
var s = sd.Split(',');
for (int i = 0; i < 9; i++)
{
for (int j = 0;j < 9; j++)
{
var su = s[i * 9 + j].Trim();
pu[i,j] =int.Parse(su==""?"0":su);
}
}
GetAnswer(pu,0);
return pu;
}
/// <summary>
/// 验证函数
/// </summary>
/// <param name="i"></param>
/// <param name="j"></param>
/// <returns></returns>
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;
}
/// <summary>
/// 使用回溯算法求解
/// </summary>
/// <param name="n"></param>
void GetAnswer(int[,]pu, int n)
{
if (n == 81)
{//是否已经是最后一个格子
cg = true;
return;
}
int i = n / 9, j = n % 9;
if (pu[i, j] != 0)
{//如果当前格子不需要填数字,就跳到下一个格子
GetAnswer(pu,n + 1);
return;
}
for (int k = 0; k < 9; k++)
{
if (!cg)
{
pu[i, j]++;//当前格子进行尝试所有解
if (IsValid(i, j))
GetAnswer(pu, n + 1);//验证通过,就继续下一个
}
}
if (!cg)
pu[i, j] = 0; //如果上面的单元无解,还原,就回溯
return;
}
}
}