首先,这个算法的前提:在解决八皇后问题时,将棋盘转为一维数组来描绘。
定义数组array,保存皇后放置位置的结果。比如:array = {0,4,7,5,2,6,1,3}
此时,array 的下标n 表示行数,value = array[n] 表示皇后所在的列数,(n+1)表示第几个皇后。
此处有一个循环,定义i = 0,循环条件i < n,该循环用于比较第(n+1)个皇后与第i 个皇后是否在同一斜线上。
进入正题:算法Math.abs(n-i) == Math.abs(array[n] - array[i])
Math.abs()表示调用Java中取绝对值的方法,因此我们先考虑:n - i == array[n] - array[i]
如果满足 n - i = array[n] - array[i] ①
①式可变为 (n - i)/(array[n] - array[i])= 1 ②式
上面我们说到:下标n表示行数,所以(n - i)表示的是两皇后所在的行数的差值。
value = array[n] 表示皇后所在的列数,所以(array[n] - array[i])表示的是两皇后所在的列数的差值。
我们用图来理解②式,圆圈表示皇后,此时我们比较两个黑圈的位置
因为(n - i)/(array[n] - array[i])= 1,而且1 = tan 45°(即图中黄色线),
说明此时两皇后(黑圈)在同一斜线上。
所以,如果满足算法Math.abs(n-i) == Math.abs(array[n] - array[i]),可以判断两个元素就在同一斜线。