web api 数独 求解代码 使用穷举回溯法
生活随笔
收集整理的這篇文章主要介紹了
web api 数独 求解代码 使用穷举回溯法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
先看效果
首先是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;}}}總結
以上是生活随笔為你收集整理的web api 数独 求解代码 使用穷举回溯法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CRM客户关系管理系统开发第十八讲——实
- 下一篇: codeforces 706 div2题