蓝桥杯Java组试题 2

简介: 受伤的皇后——21年模拟赛

一、受伤的皇后——21年模拟赛

 题目链接:

题目描述

有一个 n×n 的国际象棋棋盘(n 行 n 列的方格图),请在棋盘中摆放 n 个受伤的国际象棋皇后,要求:

    1. 任何两个皇后不在同一行。
    2. 任何两个皇后不在同一列。
    3. 如果两个皇后在同一条 45 度角的斜线上,这两个皇后之间行号的差值至少为 3 。

    请问一共有多少种摆放方案。

    输入描述

    输入的第一行包含一个整数 n。

    输出描述

    输出一个整数,表示答案。

    输入输出样例

    示例

    输入

    4

    image.gif

    输出

    2

    image.gif

    运行限制

      • 最大运行时间:1s
      • 最大运行内存: 128M

      JAVA解法 :

      importjava.util.Arrays;
      importjava.util.Scanner;
      publicclassn皇后2 {
      staticintn ;
      staticint[] a;
      staticintcount=0 ;
      publicstaticvoidmain(String[] args) {
      Scannersc=newScanner(System.in);
      n=sc.nextInt()+1;
      a=newint[n];
      dfs(1);
      System.out.println(count);
          }
      privatestaticvoiddfs(introw) {//第row皇后放何处if (row==n){
      count++;
      //System.out.println(Arrays.toString(a));        }
      for (inti=1; i<=n-1; i++) {//生成列if (check(row,i)){
      a[row]=i;
      dfs(row+1);
      a[row]=0;
                  }
              }
          }
      privatestaticbooleancheck(introw, intcol) {
      for (intj=1; j<=row; j++) {//在已经放过皇后的行进行判断if (a[j]==col) returnfalse; //j行a[j]列已有皇后if (j+a[j] ==row+col) returnfalse;//这个位置的反对角线已有皇后if (j-a[j] ==row-col) returnfalse;//这个位置的正对角线已有皇后        }
      returntrue;
          }
      }

      image.gif

      C++解法:

      #include <iostream>usingnamespacestd; 
      inta[10]={0};//用来存储第i行存储在第几列 intcount,n; 
      boolvalid(introw,inty)//判断row行的y列是否可用 { for(inti=1;i<row;i++)//判断前row-1行中有无与y冲突的列     { 
      if(a[i]==y) returnfalse;//前row-1行中有行存在第y列不可用 if((a[i]+i==row+y)&&(row-i)<3) returnfalse;//前row-1行中有列存在和第y列在反对角线上不可用 if((row-i==y-a[i])&&(row-i)<3) returnfalse;//前row-1行中有列存在和第y列在正对角线上不可用     } 
      returntrue; 
       } 
      voiddfs(introw) 
       { 
      if(row==n+1)//前row行均以排完,方案数加一      { 
      count++; 
      return; 
            } 
      for(inti=1;i<=n;i++)//依次判断1到n列有无可用   { 
      if(valid(row,i))//row行i列可用      { 
      a[row]=i;//row行存在第i列dfs(row+1);//处理下一行a[row]=0;//重置便与尝试新方案       } 
          } 
        } 
      intmain() 
      { 
      cin>>n; 
      dfs(1); 
      cout<<count; 
      return0;//给楼里一位兄弟的代码加了些个人认为的注释,便于各位理解}

      image.gif

      python解法:

      importosimportsysimportmath# 请在此输入您的代码# 使用dfs进行深度搜索,其中会有多种重复# 用dfs深搜的结果 / 行数的阶乘可得正确答案defisleagal(x,y):
      if0<=x<nand0<=y<n :
      returnTruereturnFalsedefisrowcol(i,j):  #行列没有返回Trueforkinrange(n):
      ifv[i][k] ==1orv[k][j] ==1:
      returnFalsereturnTruedefisxie(i,j): #45度对角线没有返回Truedx= [1,1,-1,-1]
      dy= [1,-1,-1,1]
      forkinrange(4):
      forminrange(1,3):
      nx=i+dx[k]*mny=j+dy[k]*mifisleagal(nx,ny) andv[nx][ny] ==1:
      returnFalsereturnTruedefdfs(x):
      ifx==n:  #当放的皇后的数量x==n时结束ans[0] +=1returnforiinrange(n):
      forjinrange(n):
      ifv[i][j] ==0andisrowcol(i,j) andisxie(i,j):
      v[i][j]=1dfs(x+1)
      v[i][j]=0ans=[0]
      n=int(input())
      num=1foriinrange(1,n+1):
      num*=iv= []
      foriinrange(n):
      v.append([0] *n)
      dfs(0)
      print(ans[0]//num )

      image.gif


      相关文章
      |
      1月前
      |
      人工智能 Python
      蓝桥杯练习题(四):Python组之历届试题三十题
      关于蓝桥杯Python组历届试题的三十个练习题的总结,包括题目描述、输入输出格式、样例输入输出以及部分题目的解题思路和代码实现。
      30 0
      蓝桥杯练习题(四):Python组之历届试题三十题
      |
      5月前
      |
      Java
      2016届蓝桥杯大赛软件类国赛Java大学B组 愤怒小鸟 数学模拟
      2016届蓝桥杯大赛软件类国赛Java大学B组 愤怒小鸟 数学模拟
      50 4
      |
      5月前
      |
      Java
      蓝桥杯Java组暴力递归搜图
      蓝桥杯Java组暴力递归搜图
      33 4
      |
      5月前
      |
      Java
      2022蓝桥杯大赛软件类国赛Java大学B组 左移右移 空间换时间+双指针
      2022蓝桥杯大赛软件类国赛Java大学B组 左移右移 空间换时间+双指针
      43 3
      |
      5月前
      |
      Java
      2021蓝桥杯大赛软件类国赛Java大学B组 完全日期 复杂遍历搜索
      2021蓝桥杯大赛软件类国赛Java大学B组 完全日期 复杂遍历搜索
      50 2
      |
      5月前
      |
      Java
      2023届蓝桥杯大赛软件类国赛Java大学B组 互质 数论
      2023届蓝桥杯大赛软件类国赛Java大学B组 互质 数论
      37 1
      |
      5月前
      |
      Java
      2023蓝桥杯大赛软件类省赛Java大学B组G题 买二增一 队列的简单应用
      2023蓝桥杯大赛软件类省赛Java大学B组G题 买二增一 队列的简单应用
      38 1
      |
      5月前
      |
      存储 前端开发 算法
      2016届蓝桥杯大赛软件类国赛Java大学B组 反幻方 暴力搜索
      2016届蓝桥杯大赛软件类国赛Java大学B组 反幻方 暴力搜索
      33 0
      |
      10天前
      |
      安全 Java 测试技术
      Java并行流陷阱:为什么指定线程池可能是个坏主意
      本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
      |
      7天前
      |
      安全 Java 开发者
      深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
      在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
      27 9