首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >找出两个皇后在n*n棋盘上相交(不会稳定)的方式?

找出两个皇后在n*n棋盘上相交(不会稳定)的方式?
EN

Stack Overflow用户
提问于 2017-01-12 03:02:30
回答 2查看 357关注 0票数 0

我可以用组合来做这件事。如果皇后区处于相同的状态,它们就不会稳定(受到攻击):

  1. 垂直
  2. 水平
  3. 对角线。

所以

  1. 它可能通过:n * P(n,2)方法
  2. 它可能通过:n * P(n,2)方法
  3. 它可能通过:2 * ( P(n,2) + P(n-1,2) + ... + P(2,2)) + 2 * (P(n-1,2) + ... + P(2,2))

对于上述情况,什么才是合适的?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);
     }
}

那么上面的逻辑呢?

EN

回答 2

Stack Overflow用户

发布于 2017-01-12 04:51:00

好吧,对于n * n板来说

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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的一些示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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)是显而易见的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static long unstableCount(long n) {
  return n * (5 * n - 1) * (n - 1) / 3;
}

值得注意的是,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 All      = O(n**4)
 Stable   = O(n**4)
 Unstable = O(n**3) // just cube

因此,对于一个大板,几乎所有的位置都是稳定的。

如果皇后是可区分的(例如,你有白色和红色的皇后),你所要做的就是用2乘以上面的数字和公式(交换皇后现在带来了一个新的位置)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static long unstableDistinguishableCount(long n) {
  return n * (5 * n - 1) * (n - 1) / 3 * 2;
}

编辑:简单的抽样实现(我们遍历所有可能的皇后位置)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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:如果我正确地理解了你的想法,你只需计算对角线攻击,然后使用对称:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;
} 
票数 2
EN

Stack Overflow用户

发布于 2017-01-12 04:44:36

这个问题有点不完整,但从评论来看,我想我已经掌握了所有的信息来回答这个问题。

既然你写到有56种方式可以让两个皇后在3*3的棋盘上相交,你就把两个皇后当作不同的对待。命令好了。例如:这两个委员会是不同的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
..q     ..Q
.Q.     .q.
...     ...

所以,你的问题的答案是n*n板的简单公式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(n*n) * (n*n - 1) - n*(n-1)*(n-2)*(3*n-1)/3
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41611489

复制
相关文章
【点滴】在 promise 中 then 和 finally 有什么区别
看上去 promise.prototype.then() 和 promise.prototype.finally 似乎非常相似。但是你需要明白它们有一些重要的差异。
疯狂的技术宅
2021/04/01
2.4K0
解读 | IaaS、PaaS和SaaS之间有什么区别?
随着时间的推移,云计算技术对于组织来说变得越来越重要。在大量的应用程序运行在不同的云模型时,组织需要做一些工作来检查这些解决方案是否更能满足其需求。组织需要确定其投资组合中的每个应用程序都在为自己和最终用户而使用正确的云模型。
CloudBest
2020/09/30
1.9K0
解读 | IaaS、PaaS和SaaS之间有什么区别?
c++和c语言之间有什么区别
  C语言是一种古老而又经久不衰的计算机程序设计语言,大约诞生于上个世纪60年代。由于它的设计有很多优点,多年以来深受广大程序设计人员的喜爱,并逐渐 淘汰了很多其它程序设计语言。我们平时使用的大多数软件都是用C语言开发的。
诸葛青云
2019/11/11
2.3K0
c++和c语言之间有什么区别
JavaScript 中 == 和 === 有什么区别?
双等号(==) 符号检查松散相等,而三等号(===) 符号检查严格相等。不同之处在于 (==) 松散相等将在进行比较之前尝试通过类型强制解析数据类型,而 (===) 严格相等将在数据类型不同时返回 false。下面我来给大家一些例子以便更好地理解它们。
海拥
2022/04/13
9740
云计算、大数据和物联网之间,有什么区别和联系?[通俗易懂]
随着大数据概念的提出,云计算中的分布式计算技术开始更多地被列入大数据技术,而人们提到云计算时,更多指的是底层基础IT资源的整合优化以及以服务的方式提供IT资源的商业模(如Iaas、PaaS、SaaS)。
全栈程序员站长
2022/11/08
8580
人工智能 | 美国和中国研究领域之间的隔阂有多严重!!?
引言 美国和中国研究领域之间的隔阂有多严重?今天给大家分享的这篇文章,通过对NeurIPS的引文数据进行分析发现,欧美研究机构也很少引用了中国的研究成果,而中国也很少引用欧美的研究成果,进而探寻讨
ShuYini
2022/12/06
2910
人工智能 | 美国和中国研究领域之间的隔阂有多严重!!?
什么是Hypervisor?Type 1 和Type 2 之间有什么区别?
在了解 Type 1 和 Type 2 Hypervisor 之间的区别以及哪个更好之前,让我们先看看 Hypervisor 是什么?
网络技术联盟站
2021/11/19
6.2K0
什么是Hypervisor?Type  1 和Type  2 之间有什么区别?
React篇(039)-Shadow DOM 和 Virtual DOM 之间有什么区别?
Shadow DOM 是一种浏览器技术,它解决了构建网络应用的脆弱性问题。Shadow DOM 修复了 CSS 和 DOM。它在网络平台中引入作用域样式。无需工具或命名约定,你即可使用原生 JavaScript 捆绑 CSS 和标记、隐藏实现详情以及编写独立的组件。Virtual DOM 是一个由 JavaScript 库在浏览器 API 之上实现的概念。
齐丶先丶森
2022/05/12
4320
php中的<?= ?>和<?php ?>有什么区别么?
大家好,又见面了,我是全栈君。 <? ?>是短标签 <?php ?>是长标签 在php的配置文件(php.ini)中有一个short_open_tag的值,开启以后可以使用PHP的短标签:<? ?>
全栈程序员站长
2022/07/11
1.2K0
.Net中Finalize()和Dispose()有什么区别?
Finalize自动释放资源,Dispose()用于手动释放资源。 释放类所使用的未托管资源的两种方式: 1.利用运行库强制执行的析构函数,但析构函数的执行是不确定的,而且,由于垃圾收集器的工作方式,它会给运行库增加不可接受的系统开销。 2.IDisposable接口提供了一种机制,允许类的用户控制释放资源的时间,但需要确保执行Dispose()。 一般情况下,最好的方法是执行这两种机制,获得这两种机制的优点,克服其缺点。假定大多数程序员都能正确调用Dispos
程序你好
2018/07/20
1.5K0
MyBatis配置中的#{}和${}有什么区别?
前几天,一位应届生去面试,被问到一个MyBatis中比较基础的问题,说MyBatis中的#号和$符号有什么区别?今天,我给大家来详细介绍一下。
Tom弹架构
2022/08/22
2.7K0
MyBatis配置中的#{}和${}有什么区别?
Java 中 CycliBarriar 和 CountdownLatch 有什么区别?
CyclicBarrier和CountDownLatch都是Java中常用的多线程同步工具,它们主要用来协调多个线程之间的行为,以便达到某种共同目标。虽然它们有一些相似之处,但在应用场景和使用方法上也存在着比较明显的区别。
用户1289394
2023/08/22
1690
Java 中 CycliBarriar 和 CountdownLatch 有什么区别?
TypeScript 中 type 和 interface 有什么区别?
大家好,我是前端西瓜哥,今天我们来看看 type 和 interface 的区别。
前端西瓜哥
2022/12/21
6460
Java中SynchronizedMap 和 ConcurrentHashMap有什么区别?
Java 中 SynchronizedMap 和 ConcurrentHashMap 都是线程安全的 Map 实现。它们通过不同的锁机制来保证多线程情况下对 Map 的操作正确性和并发性。
用户1289394
2023/08/22
2820
Java中SynchronizedMap 和 ConcurrentHashMap有什么区别?
【说站】java中&和&&有什么区别
1、&&只要有一个条件不一样就是不满足,如果第一个条件就是不满足就不判断后面的条件。而&要对所有的条件都进行判断。
很酷的站长
2022/11/24
6780
【说站】java中&和&&有什么区别
Android中Aop和Apt有什么区别?
AOP指的是:面向切面编程(Aspect-Oriented Programming)。如果说,OOP如果是把问题划分到单个模块的话,那么AOP就是把涉及到众多模块的某一类问题进行统一管理。
乱码三千
2021/07/29
1.4K0
Android中Aop和Apt有什么区别?
在 Linux 中如何强制停止进程?kill 和 killall 命令有什么区别?
在日常工作中,您会遇到两个用于在 Linux 中强制结束程序的命令;kill和killall。
网络技术联盟站
2022/04/02
3.5K0
在 Linux 中如何强制停止进程?kill 和 killall 命令有什么区别?
防火墙、IDS、IPS之间有什么区别?
1、基础防火墙类:主要是可实现基本包过滤策略的防火墙,这类是有硬件处理、软件处理等,其主要功能实现是限制对IP:port的访问。基本上的实现都是默认情况下关闭所有的通过型访问,只开放允许访问的策略。
网络安全观
2021/02/25
5.4K0
防火墙、IDS、IPS之间有什么区别?
点击加载更多

相似问题

错误:系统找不到指定的文件

31

错误-系统找不到指定的文件

130

Arduino:系统找不到指定的文件错误

12

CreateProcess错误,系统找不到指定的文件

12

python错误:系统找不到指定的文件

26
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文