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