c#版本标准数独Form1.cs文件

 

c#版本标准数独Form1.cs文件

/// <summary>
        /// 检查对角线上的数字是否符合要求
        /// </summary>
        /// <param name="x">指定位置的坐标x</param>
        /// <param name="y">指定位置的坐标y</param>
        /// <param name="z">指定位置的坐标z</param>
        /// <param name="num">将要赋给指定位置的值,应为string格式</param>
        /// <returns>如果没有冲突,返回true,否则返回false</returns>           
        private bool duijiaoCheck(int x, int y, int z, string num)
        {
            if (x % 4 == 0 && y == z || (x == 2 || x == 4 || x == 6) && y + z == 2)
            {

            }
            return true;
        }
        /// <summary>
        /// 已重载,最基本的检查是否正确的函数:用户的完成结果和初始赋值
        /// </summary>
        /// <param name="ifSkipFillString">是否跳过fillString,如果是初始赋值检测,此值应为true</param>
        /// /// <param name="totalNumber">返回数独内已经填上数字的格子的个数</param>
        /// <returns>如果没有发现异常,返回true,否则返回false</returns>
        private bool basicCheckIfRight(bool ifSkipFillString,out int totalNumber)
        {
            totalNumber = 0;
            int x = 0, y = 0, z = 0;
            for (x = 0; x < 9; x++)
                for (y = 0; y < 3; y++)
                    for (z = 0; z < 3; z++)
                    {
                        if (this.numberTextBox[x, y, z].Text != fillString)
                        {
                            totalNumber++;
                            if (!this.basicCheck(x, y, z, this.numberTextBox[x, y, z].Text))
                                return false;
                        }
                        else
                        {
                            if (!ifSkipFillString)
                                return false;
                        }
                    }
            return true;
        }


        /// <summary>
        /// 已重载,最基本的检查是否正确的函数:用户的完成结果和初始赋值
        /// </summary>
        /// <param name="ifSkipFillString">是否跳过fillString,如果是初始赋值检测,此值应为true</param>
        /// <returns>如果没有发现异常,返回true,否则返回false</returns>
        private bool basicCheckIfRight(bool ifSkipFillString)
        {
            int a = 0;
            return this.basicCheckIfRight(ifSkipFillString, out a);
        }

        /// <summary>
        /// 已重载.计算两个时间的间隔
        /// </summary>
        /// <param name="DateTime1">第一个日期和时间</param>
        /// <param name="DateTime2">第二个日期和时间</param>
        /// <returns>时间差的字符形式</returns>
        private string DateDiff(DateTime DateTime1, DateTime DateTime2)
        {
            string dateDiff = string.Empty;
            try
            {
                TimeSpan ts1 = new TimeSpan(DateTime1.Ticks);
                TimeSpan ts2 = new TimeSpan(DateTime2.Ticks);
                TimeSpan ts = ts1.Subtract(ts2).Duration();
                dateDiff = ts.Hours.ToString() + ":"
                        + ts.Minutes.ToString() + ":"
                        + ts.Seconds.ToString();
            }
            catch(Exception e)
            {
                dateDiff = e.ToString();
            }
            return dateDiff;
        }

        /// <summary>
        /// 已重载.计算指定时间与当前本地时间的时间间隔
        /// </summary>
        /// <param name="DateTime1">指定时间</param>
        /// <returns>时间差的字符形式</returns>
        private string DateDiff(DateTime DateTime1)
        {
            return this.DateDiff(DateTime1, DateTime.Now);
        }

        /// <summary>
        /// 标准数独:填充数独的所有空格
        /// </summary>
        /// <param name="x">指定的坐标x</param>
        /// <param name="y">指定的坐标y</param>
        /// <param name="z">指定的坐标z</param>
        /// <param name="num">指定的数字</param>       
        private void getAnswer(int x, int y, int z, int num)
        {
            /*
            if (this.numberTextBox[x, y, z].BackColor == Color.DarkGreen)
            {
                //结束条件,此处只计算出一个结果
                if (x == 8 && y == 2 && z == 2)
                {
                    return;
                }
                this.fowordStep(ref x, ref y, ref z);
                this.getAnswer(x, y, z, 1);
            }
            else if (this.basicCheck(x, y, z, num.ToString()))
            {
                numberTextBox[x, y, z].Text = num.ToString();
                //结束条件,此处只计算出一个结果
                if (x == 8 && y == 2 && z == 2)
                {
                    return;
                }
                this.fowordStep(ref x, ref y, ref z);
                this.getAnswer(x, y, z, 1);
            }
            else if (num < 9)
                this.getAnswer(x, y, z, num + 1);
            else
            {
                //结束条件
                if (x == 0 && y == 0 && z == 0)
                {
                    return;
                }
                this.backStep(ref x, ref y, ref z);
                int tem = int.Parse(numberTextBox[x, y, z].Text) + 1;
                this.numberTextBox[x, y, z].Text = fillString;
                this.getAnswer(x, y, z, tem);
            } */
            bool flag=false;
            int i=1;
            for (; ; )
            {                
                 if (this.numberTextBox[x, y, z].BackColor == Color.DarkGreen)
                 {
                     this.fowordStep(ref x, ref y, ref z);
                     continue;
                 }
                 for(;i<10;i++)
                 {
                     if(this.basicCheck(x,y,z,i.ToString()))
                     {
                         flag=true;
                         break;
                     }
                 }
                if(i==10)
                {
                    if (x == 0 && y == 0 && z == 0)
                    {
                        return;
                    }
                    this.backStep(ref x, ref y, ref z);
                    i = int.Parse(numberTextBox[x, y, z].Text) + 1;
                    this.numberTextBox[x, y, z].Text = fillString;                   
                }
                else
                {
                    numberTextBox[x, y, z].Text = i.ToString();
                    //结束条件,此处只计算出一个结果
                    if (x == 8 && y == 2 && z == 2)
                    {
                        return;
                    }
                    this.fowordStep(ref x, ref y, ref z);
                    i = 1;
                }
            }
        }

        /// <summary>
        /// 后退一个格子,如果新格子的数字是不可更改的,继续后退
        /// </summary>
        /// <param name="x">当前格子的坐标x</param>
        /// <param name="y">当前格子的坐标y</param>
        /// <param name="z">当前格子的坐标z</param>
        /// <returns>如果可以后退,返回true,否则false</returns>
        private bool backStep(ref int x, ref int y, ref int z)
        {
            if (z > 0)
            {
                z--;
            }
            else if (y > 0)
            {
                y--;
                z = 2;
            }
            else if (x > 0)
            {
                x--;
                y = z = 2;
            }
            else
                return false;
            //如果是初始化用的格子,继续后退
            if (this.numberTextBox[x, y, z].BackColor == Color.DarkGreen )
                this.backStep(ref x, ref y, ref z);
            //或者格子里的数字不符合要求,继续后退
            if (this.numberTextBox[x, y, z].Text == "9")
            {
                this.numberTextBox[x, y, z].Text = fillString;
                this.backStep(ref x, ref y, ref z);
            }
            return true;
        }

        /// <summary>
        /// 前进一个格子,如果新格子的数字是不可更改的,继续前进
        /// </summary>
        /// <param name="x">当前格子的坐标x</param>
        /// <param name="y">当前格子的坐标y</param>
        /// <param name="z">当前格子的坐标z</param>
        /// <returns>如果可以前进,返回true,否则false</returns>
        private bool fowordStep(ref int x, ref int y, ref int z)
        {
            if (z < 2)
            {
                z++;
            }
            else if (y < 2)
            {
                y++;
                z = 0;
            }
            else if (x < 8)
            {
                x++;
                y = z = 0;
            }
            else
                return false;
            //如果是初始化用的格子,继续前进
            if (this.numberTextBox[x, y, z].BackColor == Color.DarkGreen)
                this.fowordStep(ref x, ref y, ref z);
            return true;
        }

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值