/// <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;
}