public static int Cmp(ZZeroNode a, ZZeroNode b) { return(a.ZeroNum.CompareTo(b.ZeroNum)); }
/// <summary> /// 檢驗各列,對碰上之第一個零,做記號,同列或同欄的其他零則畫X (由零較少的列先做,可不依順序) /// /// 檢驗可否完成僅含零的完全指派,若不能,則false /// </summary> private bool step2() { _result.Clear(); bool[,] isDelete = new bool[_x, _y]; //零的数量由少到多 List <ZZeroNode> zeroNodes = new List <ZZeroNode>(); for (int x = 0; x < _x; x++) { int zeroNum = 0; for (int y = 0; y < _y; y++) { if (_data[x, y] == 0) { zeroNum++; } } if (zeroNum > 0) { zeroNodes.Add(new ZZeroNode(x, zeroNum)); } } zeroNodes.Sort(ZZeroNode.Cmp); //从零较少的行开始 while (zeroNodes.Count > 0) { ZZeroNode node = zeroNodes[0]; if (node.ZeroNum <= 0) { zeroNodes.RemoveAt(0); } else { for (int y = 0; y < _y; y++) { if (_data[node.X, y] == 0 && !isDelete[node.X, y]) { _result.Add(new Point(node.X, y)); zeroNodes.RemoveAt(0); //删除与该零在同一列的其他零 for (int xxx = 0; xxx < _x; xxx++) { if (_data[xxx, y] == 0) { isDelete[xxx, y] = true; for (int i = 0; i < zeroNodes.Count; i++) { if (zeroNodes[i].X == xxx) { zeroNodes[i].ZeroNum--; } } } } break; } } } zeroNodes.Sort(ZZeroNode.Cmp); } return(_result.Count == _x); }