我可以用组合来做。
皇后区如果在同一个地方就不会稳定(受到攻击):
垂直
水平
对角线的。
所以
可能的方法是:n * P(n,2)
方法
可能的方法是:n * P(n,2)
方法
它的可能是:2 * ( P(n,2) + P(n-1,2) + ... + P(2,2)) + 2 * (P(n-1,2) + ... + P(2,2))
对于上述情况,合适的算法是什么?
class Main
{
public static void main (String[] args) throws java.lang.Exception
{
int n = 8;
int arr[][] = new int[n][n];
long x = 0;
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
x += Math.min(n-1-i, n-1-j) + Math.min(i, j) + Math.min(n-1-i,j) + Math.min(i,n-1-j);
x+= 2*n -2;
}
}
System.out.println(x);
}
}
上述逻辑如何?
最佳答案
好吧,对于n * n
板有
All: n * n * (n * n - 1) / 2
Stable: n * (n - 1) * (n - 2) * (3 * n - 1) / 6
Unstable: n * (5 * n - 1) * (n - 1) / 3
位置。(详见https://oeis.org/A036464)小
n
s的一些示例: n all unstable stable
-----------------------------
1 0 = 0 + 0
2 6 = 6 + 0
3 36 = 28 + 8
4 120 = 76 + 44
5 300 = 160 + 140
6 630 = 290 + 340
7 1176 = 476 + 700
8 2016 = 728 + 1288
9 3240 = 1056 + 2184
10 4950 = 1470 + 3480
实现(java)是显而易见的
private static long unstableCount(long n) {
return n * (5 * n - 1) * (n - 1) / 3;
}
也许值得注意的是
All = O(n**4)
Stable = O(n**4)
Unstable = O(n**3) // just cube
所以对于一个大的董事会,几乎所有的职位都是稳定的。
如果皇后区是可区分的(例如,你有白色和红色皇后区),你所要做的就是将上面的数字和公式乘以
2
(交换皇后区现在带来了一个新的位置)。private static long unstableDistinguishableCount(long n) {
return n * (5 * n - 1) * (n - 1) / 3 * 2;
}
编辑:天真的采样实现(我们循环所有可能的皇后位置)可以是
private static long unstableCountNaive(int n) {
long result = 0;
for (int file1 = 0; file1 < n; ++file1)
for (int rank1 = 0; rank1 < n; ++rank1)
for (int file2 = file1; file2 < n; ++file2)
for (int rank2 = file1 == file2 ? rank1 + 1 : 0; rank2 < n; ++rank2)
if ((file1 == file2) || // Same file
(rank1 == rank2) || // Same rank
(file1 + rank1 == file2 + rank2) || // Same top-left bottom-right diagonal
(file1 - rank1 == file2 - rank2)) // Same bottom-left top-right diagonal
result += 1;
return result;
}
编辑2:如果我没弄错,你可以数对角线攻击数,然后使用对称:
private static long unstableCountBetter(int n) {
long result = 0;
// Attacked by top-left bottom-right diagonal
for (int rank = 0; rank < n; ++rank)
for (int file = 0; file < n; ++file)
result +=
(rank + file >= n ? 2 * n - 2 - (rank + file) : rank + file);
result =
// symmetry: we have TWO diagonals
result * 2 +
// At each postion (n * n of them) we have n - 1 checks on the same rank
n * n * (n - 1) +
// At each postion (n * n of them) we have n - 1 checks on the same file
n * n * (n - 1);
// /2 if queens are indistiguished (728 for 8x8 board)
return result / 2;
}
关于java - 找出两个皇后在n * n棋盘上相交(不稳定)的方式?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41611489/