前次为了解决初中数学问题,编程上百行搜索出来的答案没有优于小朋友想出来的答案。
刚看到这道据传是越南小学三年级的数学题: 请解出下列 9 变量的方程
[ix]
A +13\times B \div C + D +12 \times E - F -11 + G \times H \div I -10 = 66[/ix]
其中 A,B,C,D,E,F,G,H,I 为未知的 1 到 9 的正整数而且不得重复。我试了一下程序 brute force 搜索答案。程序如下
<div id="viet3">
<script>
function permute(v, n, handler) {
(function _(v, n) {
if (n == 1)
return handler(v);
for (var i = 0; i < n; i++) {
_(v, n - 1);
var tmp = v[n - 1];
var idx = n % 2 ? 0 : i;
v[n - 1] = v[idx];
v[idx] = tmp;
}
})(v, n);
}
var D = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var found = 0;
function handler(v) {
if (66 === v[0] + 13 * v[1] / v[2] + v[3] + 12 * v[4] - v[5] + v[6] * v[7] / v[8] - 21) {
$('#viet3').append(v.join(',') + '<br>');
found++;
}
}
permute(D, 9, handler);
$('#viet3').append('Found=' + found);
考虑另外一个问题,把1-9的数排成 3 x 3 的方阵,要求横竖、对角加起来都是 15。检测函数如下
function CheckN (v ) {
if(v[0]+v[1]+v[2]==15 && v[3]+v[4]+v[5]==15 && v[6]+v[7]+v[8]== 15 &&
v[0]+v[3]+v[6]==15 && v[1]+v[4]+v[7]== 15&& v[2]+v[5]+v[8]==15 && v[0]+v[4]+v[8]==15 && v[2]+v[4]+v[6]==15) {
$('#viet3').append(v.join(',') + '<br>');
found++;
}
}
permute(D, 9, CheckN);
当然这是非常笨拙的方法,4 x 4 方阵估计就算不动了。