zoukankan      html  css  js  c++  java
  • C# 数独 解法

    按照人的思维来做的。

    MyPos 就是 数组 行 列值。

     

     

    public  class CalcShuDu
        {
            public int[][] IArrSd;
            public int IBlankCount;
            public Dictionary<MyPos, List<int>> DicCanFill;
            public Dictionary<MyPos, List<int>> DicFilling;
            Dictionary<MyPos, int> dic = new Dictionary<MyPos, int>();
            public CalcShuDu(int[][] arr)
            {
               
    
                IArrSd = arr;
    
                for (int i = 0; i < arr.Length; i++)
                {
                    for (int j = 0; j < arr[i].Length; j++)
                    {
                        if (arr[i][j] == 0)
                        {
                            IBlankCount++;
                            MyPos p = new MyPos(i, j);
                            dic.Add(p, 0);
                           
                        }
                    }
                }
    
            }
    
            public Dictionary<MyPos, int> GetAnswer()
            {
                DicFilling = new Dictionary<MyPos, List<int>>();
    
                GetCanFill();
                var keys = dic.Keys.ToList();
    
                int fillCount = 0;
                bool isAdd = false;
               
                while (fillCount<= IBlankCount-1)
                {
                    isAdd = false;
    
                    if (fillCount < 0)
                    {
                        return dic;
                    }
    
                    var key = keys[fillCount];
    
                    if (DicFilling[key].Count>= DicCanFill[key].Count)
                    {
    
                        DicFilling[key].Clear();
                        IArrSd[key.X][key.Y] = 0;
                        fillCount -= 1;
                        key= keys[fillCount];
                        IArrSd[key.X][key.Y] = 0;
                        
                        continue;
                    }
    
                    var listCanFill = GetCanFill(key);
    
                    if (listCanFill.Count == 0)
                    {
                        IArrSd[key.X][key.Y] = 0;
                        fillCount -= 1;
                        key = keys[fillCount];
    
                        IArrSd[key.X][key.Y] = 0;
                    }
                    else
                    {
                        foreach (var item in listCanFill)
                        {
                            if (!DicFilling[key].Contains(item))
                            {
                                IArrSd[key.X][ key.Y] = item;
                                DicFilling[key].Add(item);
                                fillCount += 1;
                                dic[key] = item;
                                isAdd = true;   
                                break;
                            }
                        }
    
                        if (!isAdd)
                        {
                            IArrSd[key.X][key.Y] = 0;
                            DicFilling[key].Clear();
                            fillCount -= 1;
                            key=keys[fillCount];
                            IArrSd[key.X][key.Y] = 0;
                        }
    
                    }
                }
                return dic;
            }
    
            public void GetCanFill()
            {
                DicCanFill = new Dictionary<MyPos, List<int>>();
              
    
                var keys = dic.Keys.ToList();
                foreach (var key in keys)
                {
    
                    List<int> list1 = new List<int>();
                    DicFilling.Add(key, list1);
                    List<int> list = new List<int>();
    
    
                    int i = key.X;
                    int j = key.Y;
    
                    var arr = IArrSd[i];
    
                    for (int k = 0; k < arr.Length; k++)
                    {
                        if(arr[k] != 0)
                        {
                            list.Add(arr[k]);
                        }
                    }
    
                    for (int m = 0; m < 9; m++)
                    {
                        if (IArrSd[m][j] != 0)
                        {
                            if(!list.Contains(IArrSd[m][j]))
                            list.Add(IArrSd[m][j]);
                        }
                    }
    
                    var ninePos = GetNinePos(key);
    
                    for (int m = ninePos.X; m < ninePos.X+3; m++)
                    {
                        for (int k = ninePos.Y; k < ninePos.Y+3; k++)
                        {
                            if (IArrSd[m][k] != 0)
                            {
                                if (!list.Contains(IArrSd[m][k]))
                                    list.Add(IArrSd[m][k]);
                            }
                        }
                    }
                    list.Sort();
    
                    var lstCanFill=new List<int>();
    
                    for (int m   = 1; m < 10; m++)
                    {
                        if (!list.Contains(m))
                        {
                            lstCanFill.Add(m);
                        }
                    }
                    DicCanFill.Add(key, lstCanFill);
    
                }
            }
    
            public MyPos GetNinePos(MyPos pos)
            {
                int i = 0;
                int j = 0;
                int x=pos.X;
                int y=pos.Y;
                if (x >= 0 && x < 3)
                {
                    if (y >= 0 && y < 3)
                    {
                        i = 0;
                        j= 0;
                    }
                    else if (y >= 3 && y < 6)
                    {
                        i = 3;
                        j = 0;
                    }
                    else
                    {
                        i = 6;
                        j = 0;
                    }
                }
                else if (x >= 3 && x < 6)
                {
                    if (y >= 0 && y < 3)
                    {
                        i = 0;
                        j = 3;
                    }
                    else if (y >= 3 && y < 6)
                    {
                        i = 3;
                        j = 3;
                    }
                    else
                    {
                        i = 6;
                        j = 3;
                    }
                }
                else
                {
                    if (y >= 0 && y < 3)
                    {
                        i = 0;
                        j = 6;
                    }
                    else if (y >= 3 && y < 6)
                    {
                        i = 3;
                        j = 6;
                    }
                    else
                    {
                        i = 6;
                        j = 6;
                    }
                }
                return new MyPos(j,i);
            }
        
            public List<int>GetCanFill(MyPos key)
            {
              
                    var list = new List<int>();
    
                    int i = key.X;
                    int j = key.Y;
    
                    var arr = IArrSd[i];
    
                    for (int k = 0; k < arr.Length; k++)
                    {
                        if (arr[k] != 0)
                        {
                            list.Add(arr[k]);
                        }
                    }
    
                    for (int m = 0; m < 9; m++)
                    {
                        if (IArrSd[m][j] != 0)
                        {
                            if (!list.Contains(IArrSd[m][j]))
                                list.Add(IArrSd[m][j]);
                        }
                    }
    
                    var ninePos = GetNinePos(key);
    
                    for (int m = ninePos.X; m < ninePos.X + 3; m++)
                    {
                        for (int k = ninePos.Y; k < ninePos.Y + 3; k++)
                        {
                            if (IArrSd[m][k] != 0)
                            {
                                if (!list.Contains(IArrSd[m][k]))
                                    list.Add(IArrSd[m][k]);
                            }
                        }
                    }
                    list.Sort();
    
                    var lstCanFill = new List<int>();
    
                    for (int m = 1; m < 10; m++)
                    {
                        if (!list.Contains(m))
                        {
                            lstCanFill.Add(m);
                        }
                    }
    
                    return lstCanFill;
            }
        }
    
  • 相关阅读:
    求10个随机数的最大值、最小值、和、平均值
    设计并编写代码自动格斗类游戏
    用while实现阶乘
    安卓第三次作业
    第二次作业
    第一次作业
    第四次作业
    dialog
    用画图的方法理解原型对象和原型链,事半功倍今晚不加班
    【学习笔记】浅析Promise函数
  • 原文地址:https://www.cnblogs.com/HelloQLQ/p/15706243.html
Copyright © 2011-2022 走看看