Пример #1
0
        /// <summary>
        /// 指定位置数据发生变化
        /// </summary>
        /// <param name="i"></param>
        /// <param name="j"></param>
        public void DataChange(int xIndex, int yIndex, int value)
        {
            // 首先取得指定位置的数据.
            DynamicsItem data =
                DynamicsItemList.FirstOrDefault(p => p.X == xIndex && p.Y == yIndex);

            // 如果 数据不在本组里面. 直接返回.
            if (data == null)
            {
                // 返回.
                return;
            }

            // 如果 数据在本组里面. 本组内的数据, 都要删除掉 “可选数据”
            foreach (DynamicsItem oneData in DynamicsItemList)
            {
                oneData.TryRemoveUsable(value);
            }
        }
Пример #2
0
        /// <summary>
        /// 指定位置数据发生变化
        /// </summary>
        /// <param name="i"></param>
        /// <param name="j"></param>
        private void DataChange(int xIndex, int yIndex, int value)
        {
            // 首先取得指定位置的数据.
            DynamicsItem data =
                DynamicsItemList.FirstOrDefault(p => p.X == xIndex && p.Y == yIndex);


            if (logger.IsDebugEnabled)
            {
                logger.DebugFormat("### 尝试对 {0}  设置一个数值: {1}", data, value);
            }


            // 设置数据.
            data.TrySetValue(value);

            // 然后更新相关组内的关联数据.
            foreach (ItemGroup itemGroup in ItemGroupList)
            {
                itemGroup.DataChange(xIndex, yIndex, value);
            }
        }
Пример #3
0
        /// <summary>
        /// 开始处理.
        /// </summary>
        public bool DoProcess()
        {
            if (logger.IsDebugEnabled)
            {
                logger.DebugFormat(
                    "DoProcess 处理开始, 目前固定单元格数={0}, 未处理单元格数={1},已处理单元格数={2}。",
                    this.FixItemList.Count(),
                    this.DynamicsItemList.Count(p => p.RuntimeTempLock == false),
                    this.DynamicsItemList.Count(p => p.RuntimeTempLock == true));
            }


            // 检索 当前所有的 项目
            // 按照 “可用数据” 进行排序.
            var query =
                from data in this.DynamicsItemList
                where
                data.RuntimeTempLock == false
                orderby
                data.RuntimeUsableValueList.Count
                select data;

            // 取得第一个满足条件的数据.
            DynamicsItem topData = query.First();



            if (logger.IsDebugEnabled)
            {
                logger.DebugFormat("当前选中的项目:  {0}", topData);
            }



            // 复制 当前数据的, 运行时可用节点.
            List <int> tmpRuntimeList = new List <int>();

            tmpRuntimeList.AddRange(topData.RuntimeUsableValueList);


            // 成功处理标志.
            bool successFlag = false;


            // 遍历尝试每个节点.
            foreach (int tmpVal in tmpRuntimeList)
            {
                if (this.IsAllProcessSuccess)
                {
                    // 全部处理成功, 结束并返回.
                    return(true);
                }


                // 尝试设置.
                DataChange(topData.X, topData.Y, tmpVal);


                if (this.IsAllProcessSuccess)
                {
                    // 全部处理成功, 结束并返回.
                    return(true);
                }

                if (this.IsExistsProcessFail)
                {
                    // 处理失败, 需要回朔.
                    ResetAllData();
                    continue;
                }

                // 暂时是成功的, 加入处理列表.
                AddProcess(new OneProcess()
                {
                    x = topData.X, y = topData.Y, Value = tmpVal
                });

                // 重算下一个层次.
                successFlag = DoProcess();


                if (!successFlag)
                {
                    todoList.RemoveAt(todoList.Count - 1);
                    // 处理失败, 需要回朔.
                    ResetAllData();
                }
            }


            // 假如本单元的所有项目, 都处理失败了, 那么返回 false.
            return(successFlag);
        }
        /// <summary>
        /// 初始化 项目单元数据.
        /// </summary>
        /// <param name="result"></param>
        /// <param name="initArray"></param>
        protected void InitBaseItemData(ItemMaster result, int[,] initArray)
        {
            // 取得二维数组的 边长.
            sizeOfArray = Convert.ToInt32(Math.Sqrt(initArray.Length));

            // 遍历二维数组, 填写数据.
            for (int i = 0; i < sizeOfArray; i++)
            {
                for (int j = 0; j < sizeOfArray; j++)
                {

                    if (initArray[i, j] == 0)
                    {
                        // 等于零的情况.
                        DynamicsItem item = new DynamicsItem()
                        {
                            X = i,
                            Y = j,
                        };

                        // 初始化.
                        item.InitDefaultList(9);

                        // 加入 结果列表.
                        result.DynamicsItemList.Add(item);
                    }
                    else
                    {
                        // 非零的情况.
                        FixedItem item = new FixedItem()
                        {
                            X = i,
                            Y = j,
                            IintValue = initArray[i, j],
                        };

                        // 加入 固定结果列表.
                        result.FixItemList.Add(item);
                    }

                }
            }
        }