private void compute(int curVal) { //填写结束,判断结果,退出递归 if (curVal == 0) { if (isOk()) { outPut(); } else { emptyIt(); } return; } //每个数可以填写的位置 for (int i = 0; i < 2*n - curVal -1; i++) { if (fillIt(i, curVal)) { compute(curVal - 1); } } }
公司不能上传代码。只上传了上面的函数。
递归搜索方法,已得出,1000以内,只有当n=3时有这样的数。
isOK() --- 判断字符串是否满足要求
emptyIt()---清空串。
//每一对填一次空 private bool fillIt(int firstPos,int val) { int secondPos = firstPos + val + 1; //到尾了,不能填写了。 if (list.Count <= secondPos) { return false; } //两个都是空位,可以填写。 if (list[firstPos] == -1 && list[secondPos] == -1) { list[firstPos] = val; list[secondPos] = val; return true; } return false; }
@硬盘很大: 把上面代码自己补齐就可以了。已测。
@硬盘很大: 初始化一个2 * n 大小的list,然后填数。
从大往小填。
先填写n,
从0位置往后填,n的位置就是 0, 0+n+1.以此类推。
@硬盘很大: 把分给我