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