privatevoidFillExpressions(List<Operators[]> expressions) { InternalFillExpressions(expressions, new Operators[3], 0); }
privatevoidInternalFillExpressions(List<Operators[]> expressions, Operators[] expression, int depth) { if (depth == 3) { expressions.Add(expression); return; } for (Operators op = Operators.Add; op < Operators.Invalid; op++) { expression[depth] = op; InternalFillExpressions(expressions, (Operators[])expression.Clone(), depth + 1); } }
自顶向下设计程序,先计算出126种组合,遍历它们,针对每个组合取最长连续的值,得到最后结果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
int max = -1; List<int> digits = new List<int>(); var series = Utils.Combination(newint[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }, 4); foreach (var array in series) { var tmp = GetLastConsecutiveNumber(array as List<int>); if (tmp > max) { max = tmp; digits = array as List<int>; } }
privateintGetLastConsecutiveNumber(List<int> numbers) { List<int> targets = new List<int>(); var candidates = Utils.Permutations(numbers); foreach (var c in candidates) { targets.AddRange(GetTargets(c.ToList())); }
targets = targets.Where(i => i > 0).Distinct().ToList(); targets.Sort(); for (int i = 0; i < targets.Count; i++) { if (targets[i] != i + 1) { return i; } }
return-1; }
针对其中一种排列,运用64个表达式,计算出各种可能的值。
1 2 3 4 5 6 7 8 9 10
private List<int> GetTargets(List<int> numbers) { List<int> targets = new List<int>(); foreach (var expression in expressions) { targets.AddRange(GetTargets(numbers, expression)); }
switch (op) { case Operators.Add: return left + right; case Operators.Sub: return left - right; case Operators.Mul: return left * right; case Operators.Div: if (right == 0) { returnnull; }