麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

數(shù)獨(dú)解算器(ASP.NET 2.0)

2019-11-18 16:41:56
字體:
供稿:網(wǎng)友

數(shù)獨(dú)游戲 在9x9的方格內(nèi)進(jìn)行, 分為3x3的小方格,被稱為“區(qū)”。
數(shù)獨(dú)游戲首先從已經(jīng)填入數(shù)字的格子開始。
數(shù)獨(dú)游戲的目的是根據(jù)下列規(guī)則,用1至9之間的數(shù)字填滿空格:
每個(gè)數(shù)字在每一行、每一列和每一區(qū)只能出現(xiàn)一次。
我在 linux 服務(wù)器(請參見“在 Linux 下運(yùn)行 asp.net 2.0”)上用 ASP.NET 2.0 實(shí)現(xiàn)了一個(gè)數(shù)獨(dú)解算器。
http://www.sudoku.name 網(wǎng)站上也有一個(gè)用戶界面相當(dāng)不錯(cuò)的“數(shù)獨(dú)解算器” ,但是其算法太差了,運(yùn)算速度比我的算法慢多了。以其網(wǎng)站上的“#5328”謎題(也是我的數(shù)獨(dú)解算器的例題)為例,它需要大約四個(gè)小時(shí)才能給出答案,而我的解算器不到一秒鐘就可以給出答案。從它的運(yùn)算過程來算,估計(jì)是逐個(gè)空格進(jìn)行解算。而我的算法是先找出能填入數(shù)字個(gè)數(shù)最少的空格進(jìn)行解算。算法這個(gè)微小的改進(jìn),就極大地提高了計(jì)算效率。好了,廢話少說,下面就是源程序:

1. sudoku.aspx:
 1<%@ Page Language="C#" inherits="Skyiv.Ben.Web.SudokuPage" %>
 2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
            " 3<html xmlns=" 4<head runat="server">
 5  <title>銀河 - 數(shù)獨(dú)</title>
 6</head>
 7<body>
 8  <form id="form1" runat="server">
 9  <asp:Button Text="返回" OnClick="BtnUriHome_Click" runat="server" />
10  <asp:Button Text="開始" OnClick="BtnSubmit_Click" runat="server" />
11  <hr />
12  <div>
13  <a href="
http://www.sudoku.name/index-cn.php" target="_blank">數(shù)獨(dú)游戲</a>
14  在9x9的方格內(nèi)進(jìn)行, 分為3x3的小方格,被稱為“區(qū)”。<br />
15  數(shù)獨(dú)游戲首先從已經(jīng)填入數(shù)字的格子開始。<br />
16  數(shù)獨(dú)游戲的目的是根據(jù)下列規(guī)則,用1至9之間的數(shù)字填滿空格:<br />
17  http://www.companysz.com 每個(gè)數(shù)字在每一行、每一列和每一區(qū)只能出現(xiàn)一次。<br />
18  </div>
19  <div>
20  <asp:TextBox Runat="Server" Id="tbxInput" MaxLength="512" Wrap="False"
21    TextMode="MultiLine" Columns="15" Rows="14" />
22  <asp:TextBox Runat="Server" Id="tbxOutput" ReadOnly="True" Wrap="False"
23    TextMode="MultiLine" Columns="15" Rows="14" />
24  </div>
25  </form>
26</body>
27</html>
28
2. sudoku.aspx.cs:
 1using System;
 2using System.IO;
 3using System.Web.UI;
 4using System.Web.UI.WebControls;
 5using Skyiv.Ben.Etc;
 6
 7namespace Skyiv.Ben.Web
 8{
 9  public class SudokuPage : Page
10  {
11    PRotected TextBox tbxInput;
12    protected TextBox tbxOutput;
13
14    public void Page_Load(object sender, EventArgs e)
15    {
16      if (IsPostBack) return;
17      tbxInput.Text =    "+---+---+---+/n|2..|||/n|8..|1..|.2.|/n"
18        + "|..5|.7.|.3.|/n+---+---+---+/n|.7.|.3.|1..|/n|.9.|.4.|.8.|/n"
19        + "|..4||.7.|/n+---+---+---+/n|.3.|.9.|6..|/n|.8.|..5|..3|/n"
20        + "|||..5|/n+---+---+---+";
21    }
22
23    public void BtnUriHome_Click(object sender, EventArgs e)
24    {
25      Response.Redirect(Pub.UriHome);
26    }
27
28    public void BtnSubmit_Click(object sender, EventArgs e)
29    {
30      try
31      {
32        Sudoku sudoku = new Sudoku(new StringReader(tbxInput.Text));
33        StringWriter writer = new StringWriter();
34        sudoku.Out(writer);
35        tbxOutput.Text = writer.ToString();
36      }
37      catch (Exception ex)
38      {
39        tbxOutput.Text = "Error: " + ex.Message;
40      }
41    }
42  }
43}
44
3. sudoku.cs:
  1using System;
  2using System.IO;
  3using System.Collections.Generic;
  4
  5namespace Skyiv.Ben.Etc
  6{
  7  sealed class Sudoku
  8  {
  9    byte[,] input, output;
 10    int steps = 0;
 11
 12    public Sudoku(TextReader reader)
 13    {
 14      input = new byte[9, 9];
 15      for (int y = 0; y < 9; )
 16      {
 17        string s = reader.ReadLine();
 18        if (s == null) break;
 19        s = s.Replace('.', '0');
 20        int x = 0;
 21        for (int i = 0; i < s.Length; i++)
 22          if (Char.IsDigit(s, i) && x < 9) input[x++, y] = (byte)(s[i] - '0');
 23        if (x != 0) y++;
 24      }
 25    }
 26
 27    public void Out(TextWriter writer)
 28    {
 29      Compute(input);
 30      Out(writer, output);
 31    }
 32
 33    void Out(TextWriter writer, byte[,] output)
 34    {
 35      for (int y = 0; y <= output.GetLength(1); y++)
 36      {
 37        if (y % 3 == 0) writer.WriteLine("+---+---+---+");
 38        if (y >= output.GetLength(1)) break;
 39        for (int x = 0; x <= output.GetLength(0); x++)
 40        {
 41          if (x % 3 == 0) writer.Write('|');
 42          if (x >= output.GetLength(0)) break;
 43          writer.Write((output[x, y] == 0) ? '.' : (char)(output[x, y] + '0'));
 44        }
 45        writer.WriteLine();
 46      }
 47    }
 48
 49    bool Compute(byte[,] input)
 50    {
 51      List<byte[,]> list = StepIt(input);
 52      if (list == null) return true;
 53      foreach (byte[,] temp in list) if (Compute(temp)) return true;
 54      return false;
 55    }
 56
 57    // return null for finish
 58    List<byte[,]> StepIt(byte[,] input)
 59    {
 60      if (steps++ > 100000) throw new Exception("太復(fù)雜了");
 61      output = input;
 62      int theX = -1, theY = -1;
 63      byte[] theDigits = null;
 64      for (int y = 0; y < input.GetLength(1); y++)
 65      {
 66        for (int x = 0; x < input.GetLength(0); x++)
 67        {
 68          if (input[x, y] != 0) continue;
 69          byte[] digits = GetDigits(input, x, y);
 70          if (digits.Length == 0) return new List<byte[,]>();
 71          if (theDigits != null && theDigits.Length <= digits.Length) continue;
 72          theX = x;
 73          theY = y;
 74          theDigits = digits;
 75        }
 76      }
 77      if (theDigits == null) return null;
 78      List<byte[,]> result = new List<byte[,]>();
 79      foreach (byte digit in theDigits)
 80      {
 81        byte[,] temp = (byte[,])input.Clone();
 82        temp[theX, theY] = digit;
 83        result.Add(temp);
 84      }
 85      return result;
 86    }
 87
 88    byte[] GetDigits(byte[,] input, int x, int y)
 89    {
 90      bool[] mask = new bool[10];
 91      for (int i = 0; i < 9; i++)
 92      {
 93        mask[input[x, i]] = true;
 94        mask[input[i, y]] = true;
 95      }
 96      for (int i = x / 3 * 3; i < x / 3 * 3 + 3; i++)
 97        for (int j = y / 3 * 3; j < y / 3 * 3 + 3; j++)
 98          mask[input[i, j]] = true;
 99      List<byte> list = new List<byte>();
100      for (int i = 1; i < mask.Length; i++) if (!mask[i]) list.Add((byte)i);
101      return list.ToArray();
102    }
103  }
104}
105
以上代碼都很簡單,也不需要再另外解說了。
http://www.companysz.com/skyivben/archive/2007/01/26/631233.html


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 免费在线观看成人网 | 亚洲综合一区二区三区 | 最新福利在线 | 欧美18一19sex性护士农村 | av免费在线观看免费 | 国产日韩在线观看一区 | 亚洲综合一区在线观看 | 巨根插入| 久久久久久久久亚洲精品 | av在线免费不卡 | 欧美精品a∨在线观看不卡 午夜精品影院 | 黄网站在线观 | 久久久久国产精品久久久久 | 国产在线观看91精品 | 欧美一级黄色免费看 | 一本色道久久综合狠狠躁篇适合什么人看 | 久久久精品99| 精品91av | 日本在线视频二区 | 欧美aⅴ视频 | 国产亚洲美女精品久久久2020 | 久久久久在线观看 | 有色视频在线观看 | 一级做a爱片久久毛片a高清 | 国产一级一片免费播放 | 免费黄色大片在线观看 | 成人免费观看毛片 | h色网站免费观看 | 国产精品99久久99久久久二 | 快播av在线 | 午夜精品成人一区二区 | 2021国产精品视频 | 中国久久久 | 免费看日产一区二区三区 | 91美女视频在线 | 欧美一级aa免费毛片 | 国产成人精品网站 | 欧美人与牲禽动交精品一区 | 免费观看一区二区三区视频 | 亚洲99| 亚洲福利视频52 |