zoukankan      html  css  js  c++  java
  • 独数计算

    前段时间看到说有人设计了个很难的独数,花了在个月时间,人为解肯定是很复杂,但是我们程序猿可以用代码来解解看.之前也没有把代码放上来.主要是用递归,其它递归这个j8是很耗内存的.

    今天又看到一园友的博客写独数据算法,我粗看了一下,也没细读代码,看到说解第三个独数要用10秒,我本来想试试我的代码,结果我看博主的独数就是我以前用的,所以数据也不用改直接运行,感觉还是很快啊.不会用10称吧.后来加了时间看效果,0.9秒就搞定了啊.回复了楼主,说了要贴代码出来,所以下面直接不啰嗦,上代码.代码很乱,我现在也看不懂了.只是有运行结果.

    C#的一坨代码

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.Sql;
    using System.IO;
    using System.Linq;
    using System.Linq.Expressions;
    using System.Runtime.Serialization.Formatters.Binary;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Text.RegularExpressions;
    using System.Data;
    using ConsoleApplication1.Class1;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                Num n = new Num();
                //n.SetPosition(5, 2);
                //ArrayList al = n.GetNum();
    
                //n.Print();
    
                //n.Foo(0); //直接用这个会溢出,因为数据量操作太大了
    
                n.sw.Start();
    
                var t = new Thread(() => { n.Foo(0); }, 1073741824);
                t.Start();
    
                Console.Read();
            }
    
        }
    
        public class Num
        {
            public System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
    
            private int row;
            private int col;
    
            public void SetPosition(int r, int c)
            {
                row = r;
                col = c;
            }
    
            private int[,] a = new int[9, 9] { 
            {8,0,0,0,0,0,0,0,0},
            {0,0,3,6,0,0,0,0,0},
            {0,7,0,0,9,0,2,0,0},
    
            {0,5,0,0,0,7,0,0,0},
            {0,0,0,0,4,5,7,0,0},
            {0,0,0,1,0,0,0,3,0},
    
            {0,0,1,0,0,0,0,6,8},
            {0,0,8,5,0,0,0,1,0},
            {0,9,0,0,0,0,4,0,0}
    
            };
    
            //栈记录可以填写的数据
            private Stack<TryData> stack = new Stack<TryData>();
    
            //打印
            public void Print()
            {
                for (int i = 0; i < 9; i++)
                {
                    for (int j = 0; j < 9; j++)
                    {
                        Console.Write(a[i, j] + " ");
                        if (j % 3 == 2)
                            Console.Write("  ");
                    }
                    Console.WriteLine();
                    if (i % 3 == 2)
                        Console.WriteLine();
                }
    
                Console.WriteLine("time:" + sw.Elapsed);
            }
    
            public ArrayList GetNum()
            {
                //List<int> n = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
                ArrayList n = new ArrayList() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
                //行
                for (int i = 0; i < 9; i++)
                {
                    n.Remove(a[row, i]);
                }
                //列
                for (int i = 0; i < 9; i++)
                {
                    n.Remove(a[i, col]);
                }
    
                //当前九宫格
                int[] r = new int[3];
                int[] c = new int[3];
    
                if (row % 3 == 0)
                {
                    //第一行
                    r[0] = row;
                    r[1] = row + 1;
                    r[2] = row + 2;
                }
                else if (row % 3 == 1)
                {
                    //第二行
                    r[0] = row - 1;
                    r[1] = row;
                    r[2] = row + 1;
                }
                else
                {
                    //第三行
                    r[0] = row - 2;
                    r[1] = row - 1;
                    r[2] = row;
                }
    
                //r[row % 3] = row;
                //r[(row % 3 + 1) % 3] =0;
                //r[(row % 3 + 2) % 3] =0;
    
                if (col % 3 == 0)
                {
                    c[0] = col;
                    c[1] = col + 1;
                    c[2] = col + 2;
                }
                else if (col % 3 == 1)
                {
                    c[0] = col - 1;
                    c[1] = col;
                    c[2] = col + 1;
                }
                else
                {
                    c[0] = col - 2;
                    c[1] = col - 1;
                    c[2] = col;
                }
    
                for (int i = 0; i < r.Length; i++)
                {
                    for (int j = 0; j < c.Length; j++)
                    {
                        n.Remove(a[r[i], c[j]]);
                    }
                }
    
                return n;
            }
    
            public void Foo(int back)
            {
                if (back == 1)
                {
                    //回退情况
                    if (stack.Count > 0)
                    {
                        TryData d = stack.Pop();
    
                        if (d.Row == row && d.Col == col)
                        {
                            if (d.N >= d.Al.Count)
                            {
                                //清理返回
                                a[row, col] = 0;
    
                                Backward();
    
                                Foo(1);
                            }
                            else
                            {
    
                                a[row, col] = Convert.ToInt32(d.Al[d.N]);//试下一个数
                                d.N++;
                                stack.Push(d);
    
                                //前进
                                Forward();
    
                                Foo(0);
                            }
                        }
                        else
                        {
                            stack.Push(d);
                            Backward();
    
                            Foo(1);
                        }
                    }
                    else
                    {
                        Console.WriteLine("stack over");
                        return;
                    }
                }
                else
                {
                    //前进情况
                    #region
                    if (a[row, col] == 0)
                    {
                        //试数
                        TryData td = new TryData();
                        td.Al = GetNum();
                        if (td.Al.Count == 0)
                        {
                            //清理返回
                            a[row, col] = 0;
    
                            Backward();
                            Foo(1);
                        }
                        else
                        {
                            td.Row = row;
                            td.Col = col;
    
                            a[row, col] = Convert.ToInt32(td.Al[td.N]);//试下一个数
                            td.N++;
                            stack.Push(td);
    
                            //前进
                            Forward();
                            Foo(0);
                        }
                    }
                    else
                    {
                        Forward();
                        Foo(0);
                    }
                    #endregion
    
                }
            }
    
            //前进
            private void Forward()
            {
                col++;
                if (col >= 9)
                {
                    col = 0;
                    row++; //Console.WriteLine("+=>{0} 行", row);
                    if (row >= 9)
                    {
                        //Console.WriteLine("Last Row");
                        Print();
                        sw.Stop();
                        return;
                    }
                }
    
            }
            //后退
            private void Backward()
            {
                col--;
                if (col < 0)
                {
                    col = 8;
                    row--; //Console.WriteLine("-=>{0} 行", row);
                    if (row < 0)
                    {
                        Console.WriteLine("First Row");
                        return;
                    }
                }
            }
    
        }
    
        public class TryData
        {
            //这个数据在棋盘上的位置
            public int Row = 0;
            public int Col = 0;
    
            //当前取的第几个
            public int N = 0;
            //这个空符合的数据
            public ArrayList Al { get; set; }
        }
    
    }
    

      上一张运行的结果图片

    基本上几次都是0.9秒左右

  • 相关阅读:
    cpu降频问题
    配置 logrotate 指导
    Ubuntu 和 Ros 对应版本关系
    Git 文件管理
    Win10(UEFI启动) 安装Ubuntu16.04双系统
    Clion ROS开发环境设置
    clion 创建快捷方式和配置ros开发环境
    Ubuntu 16.04安装 CastXML
    eigen3 版本信息查看
    ubunutu eigen3包的查找
  • 原文地址:https://www.cnblogs.com/gw2010/p/3217707.html
Copyright © 2011-2022 走看看