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