



/// 空格向左移动,前提是空格不在最左一列
/// </summary>
/// <returns></returns>
public ChessPos MoveLeft()
{
//若空格在最左边界上,无法左移
if (ZeroColumn==0)
{
return null;
}
//先拷贝当前的,然后把空格左移动一位,交换下两个的数字
ChessPos tmpPos = this.Clone() as ChessPos;
tmpPos.father = this;
tmpPos.position[ZeroRow, ZeroColumn] = position[ZeroRow, ZeroColumn - 1];
tmpPos.position[ZeroRow, ZeroColumn - 1] = position[ZeroRow, ZeroColumn];
return tmpPos;
}
//当Open表中有内容,
while (OpenList.Count > 0 && !bFindSolution)
{
//1.从Open表表头取一个对象,若该位置没有在closed表出现过,则放入到Close表。
ChessPos tmp = OpenList[0];
OpenList.RemoveAt(0);
//判断该布局是否在close表中已经出现过
bool bAlreadyExist = false;
for (int i = 0; i <= CloseList.Count - 1; i++)
{
if (CloseList[i].Equals(tmp))
{
bAlreadyExist = true;
break;
}
}
if (bAlreadyExist == false)
{
CloseList.Add(tmp);
}
//2.获得新的4种空格的可能走法
List<ChessPos> PossibleSteps = tmp.getNextPosition();
foreach (ChessPos pos in PossibleSteps)
{
//看是否已经达到最终位置
if (pos.IsSolution())
{
bFindSolution = true;
solution = pos;
break;
}
else if (CloseList == null || !CloseList.Contains(pos) )
{
//若新的图案在open&close表中都没有出现过,则加入open表中
if(OpenList == null || !OpenList.Contains(pos) )
{
OpenList.Add(pos);
}
}
}
OnProgressChanged(new ChessPosEventArg(OpenList.Count, CloseList.Count));
//超过3万就不搜索了
if (CloseList.Count > 30000)
{
break;
}
}