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;
        }


    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值