数独解法 C

数独解法 C实在闲着无聊 把平时在公司闲着无聊刷的有意思一点的算法题发一下把 虽然平时喜欢写 C 不过上班用的 C 嘛 就随手 C 写了 有更好想法 或者想一起交流学习的就留言咯 尤其是有游戏客户端开发的大佬能一起学习就更好了 本人服务器开发 哈哈 不多说 上代码吧 publicclassS privateclass

实在闲着无聊,把平时在公司闲着无聊刷的有意思一点的算法题发一下把。虽然平时喜欢写C++,不过上班用的C#嘛,就随手C#写了。有更好想法,或者想一起交流学习的就留言咯~尤其是有游戏客户端开发的大佬能一起学习就更好了(本人服务器开发,哈哈)不多说,上代码吧。

 public class SudokuArea { private class SudokuInputNode { public List 
  
    ValidList = new List 
   
     (); public int CurNum; public int Column; public int Row; public int Area; public int Next; } private class SudokuArea { public int Id; public List 
    
      SourceList = new List 
     
       (); public List 
      
        InputList = new List 
       
         (); } private class SudokuColumn { public int Id; public List 
        
          SourceList = new List 
         
           (); public List 
          
            InputList = new List 
           
             (); } private class SudokuRow { public int Id; public List 
            
              SourceList = new List 
             
               (); public List 
              
                InputList = new List 
               
                 (); } // 测试用数据 private readonly int[] _numberArray = { 5, 3, 0, 0, 7, 0, 0, 0, 0, 6, 0, 0, 1, 9, 5, 0, 0, 0, 0, 9, 8, 0, 0, 0, 0, 6, 0, 8, 0, 0, 0, 6, 0, 0, 0, 3, 4, 0, 0, 8, 0, 3, 0, 0, 1, 7, 0, 0, 0, 2, 0, 0, 0, 6, 0, 6, 0, 0, 0, 0, 2, 8, 0, 0, 0, 0, 4, 1, 9, 0, 0, 5, 0, 0, 0, 0, 8, 0, 0, 7, 9, }; private readonly List 
                
                  _sudokuInputList = new List 
                 
                   (); private readonly Dictionary 
                  
                    _sudokuAreas = new Dictionary 
                   
                     (); private readonly Dictionary 
                    
                      _sudokuColumns = new Dictionary 
                     
                       (); private readonly Dictionary 
                      
                        _sudokuRows = new Dictionary 
                       
                         (); private void Run() { var curIndex = 0; while (curIndex < _sudokuInputList.Count || curIndex < 0) { var curNode = _sudokuInputList[curIndex]; if (!TryNodeNextNum(curNode)) { RemoveInputNum(curNode.Row, curNode.Column, curNode.Area, curNode.CurNum); curIndex--; var lastNode = _sudokuInputList[curIndex]; RemoveInputNum(lastNode.Row, lastNode.Column, lastNode.Area, lastNode.CurNum); continue; } curIndex++; } foreach (var node in _sudokuInputList) { _numberArray[node.Row * 9 + node.Column] = node.CurNum; } } private void Init() { InitSudokuData(); InitSudokuNodeValidNum(); } private void AddInputNum(int rowId, int columnId, int areaId, int num) { _sudokuRows[rowId].InputList.Add(num); _sudokuColumns[columnId].InputList.Add(num); _sudokuAreas[areaId].InputList.Add(num); } private void RemoveInputNum(int rowId, int columnId, int areaId, int num) { _sudokuRows[rowId].InputList.Remove(num); _sudokuColumns[columnId].InputList.Remove(num); _sudokuAreas[areaId].InputList.Remove(num); } private bool TryNodeNextNum(SudokuInputNode node) { bool valid = false; var curNum = 0; while (node.Next < node.ValidList.Count) { curNum = node.ValidList[node.Next++]; if (CheckNumValid(node.Row, node.Column, node.Area, curNum)) { valid = true; break; } } if (!valid) { node.CurNum = 0; node.Next = 0; return false; } node.CurNum = curNum; AddInputNum(node.Row, node.Column, node.Area, node.CurNum); return true; } private bool CheckNumValid(int rowId, int columnId, int areaId, int num) { if (_sudokuAreas.TryGetValue(areaId, out var area)) { if (area.SourceList.Contains(num) || area.InputList.Contains(num)) { return false; } } if (_sudokuColumns.TryGetValue(columnId, out var column)) { if (column.SourceList.Contains(num) || column.InputList.Contains(num)) { return false; } } if (_sudokuRows.TryGetValue(rowId, out var row)) { if (row.SourceList.Contains(num) || row.InputList.Contains(num)) { return false; } } return true; } // 初始化所有节点可填数字 private void InitSudokuNodeValidNum() { foreach (var node in _sudokuInputList) { for (var i = 1; i <= 9; ++i) { if (_sudokuAreas.TryGetValue(node.Area, out var area)) { if (area.SourceList.Contains(i)) { continue; } } if (_sudokuColumns.TryGetValue(node.Column, out var column)) { if (column.SourceList.Contains(i)) { continue; } } if (_sudokuRows.TryGetValue(node.Row, out var row)) { if (row.SourceList.Contains(i)) { continue; } } node.ValidList.Add(i); } } } private void InitSudokuData() { for (var i = 0; i < _numberArray.Length; i++) { var column = i % 9; var row = i / 9; var num = _numberArray[i]; var area = GetSudokuAreaId(row, column); if (num == 0) { _sudokuInputList.Add(new SudokuInputNode { CurNum = 0, Column = column, Row = row, Area = area }); continue; } if (_sudokuColumns.TryGetValue(column, out var sudokuColumn)) { sudokuColumn.SourceList.Add(num); } else { _sudokuColumns.Add(column, new SudokuColumn{ Id = column, SourceList = {num} }); } if (_sudokuRows.TryGetValue(row, out var sudokuRow)) { sudokuRow.SourceList.Add(num); } else { _sudokuRows.Add(row, new SudokuRow { Id = row, SourceList = { num } }); } if (_sudokuAreas.TryGetValue(area, out var sudokuArea)) { sudokuArea.SourceList.Add(num); } else { _sudokuAreas.Add(area, new SudokuArea { Id = area, SourceList = { num } }); } } } private int GetSudokuAreaId(int row, int column) { return (row / 3) * 3 + (column / 3); } } 
                        
                       
                      
                     
                    
                   
                  
                 
                
               
              
             
            
           
          
         
        
       
      
     
    
  

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208086.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午12:23
下一篇 2026年3月19日 下午12:23


相关推荐

  • Java中byte类型的范围「建议收藏」

    Java中byte类型的范围「建议收藏」java种为什么byte的范围是-128~127在java中byte类型占8位表示的范围是00000000~11111111总共256个数,java中byte类型有正负,最高位表示正负,0为正,1为负。我们先看正数:00000000~01111111(原码)(0~127,共128个数)我们知道在计算机系统中,数值一律用补码来表示和存储。正数的原码,反码,补码…

    2022年6月29日
    38
  • 如何用AI快速诊断电脑故障 AI系统错误自动修复工具【教程】

    如何用AI快速诊断电脑故障 AI系统错误自动修复工具【教程】

    2026年3月12日
    2
  • linux中设置固定ip(亲测有效)[通俗易懂]

    linux中设置固定ip(亲测有效)[通俗易懂]首先打开虚拟机  打开xshell5连接虚拟机(比较方便,这里默认设置过Linux的ip,只是不固定)输入ifconfig,可以查看网管相关配置信息:然后输入  vi/etc/sysconfig/network-scripts/ifcfg-ens33命令。修改网卡配置文件按i键进行编辑。修改入下,原有的配置不要删,只要按下面修改就好。没有的配置项新增上去就…

    2022年5月5日
    49
  • java: integer number is too large「建议收藏」

    java: integer number is too large「建议收藏」今天想定义一个类常量,结果如下面那样定义,确报错了。erroris:IntegernumbertoolargepublicstaticfinalLongSTARTTIME=1493568000000;12我就去查了下,在后面加上L,就好了,就会作为long类型来处理了,若是不加,则作…

    2022年7月17日
    53
  • outsystems刚做项目时的注意点-划重点

    outsystems刚做项目时的注意点-划重点outsystems 的注意点 划重点菜鸟程序员一个 一直想写博客来锻炼自己的 一直都没开动 不过最近刚好在名古屋丰田里面做个项目 用了低代码开发软件 outsystems 2019 年 4 月开始接触的 目前已经 7 个月了 看到国内好多人都还没接触到 outsystems 或者刚接触的 会有很多问题 于是就萌生写博客的想法 大家一起学习 有一个非常重要的一点 这里先记下来 自己练习无所谓 下面的内容适

    2026年3月17日
    2
  • pycharm双击打不开,没有反应,下列方法亲测有用!

    pycharm双击打不开,没有反应,下列方法亲测有用!关于这个问题,刚好我朋友安装的pycharm出现了同样地问题,激活成功教程安装一段时间后就突然打不开了,网上有许多的解决办法,我都试了一遍还是无果,后来自己发现了问题所在,首先给大家科普一下网上的方法,再放上我的,请大家耐心读完。亲测有效!!!第一种:1.打开C:\Windows\System32;以管理员身份运行cmd.exe;2.在打开的cmd窗口中,输入netshwinsockreset,按回车键;3.重启电脑;4.重启后,双击pycharm图标就能打开了!第二种:在Pycha

    2022年8月25日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号