//这个函数与上面的函数基本相同,但只统计连续个数不返回坐标。 public int SumStar(StarsBoard mTable, StarsBoard FullBoard, int p) { Stack <int> mArray = new Stack <int>(); //栈——将处理点表 int mP = p; //正在处理点 int mAP; //临时变量——可能被入栈的点 int cnt = System.Convert.ToInt32(0); int x; int i; mArray.Push(mP); //入栈 do { if (mTable.GetValue(mP) == false) //若未处理过 { x = mP >> 4; if ((this.m_Array[x] & (1 << (mP & 0xF))) != 0) //若有子 { //临近点入栈 if ((mP & 0xF) > 0) //上 { mAP = (int)(mP - 1); if (!mTable.GetValue(mAP)) { mArray.Push(mAP); } } if ((mP & 0xF) < 10) //下 { mAP = (int)(mP + 1); if (!mTable.GetValue(mAP)) { mArray.Push(mAP); } } if (x > 0) //左 { mAP = (int)(mP - 0x10); if (!mTable.GetValue(mAP)) { for (i = x - 1; i >= 0; i--) //向右查找第一个非空行取坐标。 { if (FullBoard.m_Array[i] != 0) { mAP = (int)((i << 4) | (mP & 0xF)); break; } } mArray.Push(mAP); } } if (x < 9) //右 { mAP = (int)(mP + 0x10); if (!mTable.GetValue(mAP)) { for (i = x + 1; i <= 9; i++) { if (FullBoard.m_Array[i] != 0) { mAP = (int)((i << 4) | (mP & 0xF)); break; } } mArray.Push(mAP); } } cnt++; //记录个数 } mTable.SetTrue(mP); //修改为已处理 } if (mArray.Count == 0) //还有点就出栈,没有就结束 { break; } else { mP = mArray.Pop(); } } while (true); return(cnt); }
//获取连通性。局面,已处理表,点坐标,连通点集,连通点集包含的点数。 public void FillPath(StarsBoard mTable, StarsBoard FullBoard, int p, ref int[] retval, ref int retcnt) { Stack <int> mArray = new Stack <int>(); //栈——将处理点表 int mP = p; //正在处理点 int mAP; //临时变量——可能被入栈的点 int cnt = System.Convert.ToInt32(0); int x; int i; mArray.Push(mP); //入栈 do { if (mTable.GetValue(mP) == false) //若未处理过 { x = mP >> 4; if ((this.m_Array[x] & (1 << (mP & 0xF))) != 0) //若有子 { //临近点入栈 if ((mP & 0xF) > 0) //上 { mAP = (int)(mP - 1); if (!mTable.GetValue(mAP)) { mArray.Push(mAP); } } if ((mP & 0xF) < 10) //下 { mAP = (int)(mP + 1); if (!mTable.GetValue(mAP)) { mArray.Push(mAP); } } if (x > 0) //左 { mAP = (int)(mP - 0x10); if (!mTable.GetValue(mAP)) { for (i = x - 1; i >= 0; i--) { if (FullBoard.m_Array[i] != 0) { mAP = (int)((i << 4) | (mP & 0xF)); //向左查找第一个非空行取坐标。 break; } } mArray.Push(mAP); } } if (x < 9) //右 { mAP = (int)(mP + 0x10); if (!mTable.GetValue(mAP)) { for (i = x + 1; i <= 9; i++) //向右查找第一个非空行取坐标。 { if (FullBoard.m_Array[i] != 0) { mAP = (int)((i << 4) | (mP & 0xF)); break; } } mArray.Push(mAP); } } //记录本点 retval[cnt] = mP; cnt++; } mTable.SetTrue(mP); //修改为已处理 } if (mArray.Count == 0) //还有点就出栈,没有就结束 { break; } else { mP = mArray.Pop(); } } while (true); //按Y进行排序,以便恢复局面时使用。 Array.Sort(retval, 0, cnt, pc); //返回有效个数 retcnt = cnt; }