蓝桥杯训练 2n皇后

问题描述
  给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。
输入格式
  输入的第一行为一个整数n,表示棋盘的大小。
  接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。
输出格式
  输出一个整数,表示总共有多少种放法。
样例输入
4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
样例输出
2
样例输入
4
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1
样例输出
0

import  java.util.*;  

public class Test__23  {
       static int m;
       static int count = 0;
       static int H[][];
   public static void main(String[] args) {
       Scanner sc = new Scanner(System.in);
       m = sc.nextInt();
       H = new int[m][m];
       for(int i=0; i<H.length; i++){
           for(int j=0; j<H[i].length; j++){
               H[i][j] = sc.nextInt();
           }
       }
       Put(0,2);
       System.out.println(count);
   }

   public static void Put(int t,int s)
   {
       if(t==m)
       {
           if(s==2)Put(0,3);
           else count++;
           return ;
       }
       for(int i=0;i<m;i++)
       {  

           if(H[t][i]!=1)continue;
           if(place(t,i,s))H[t][i]=s;
           else continue;
           Put(t+1,s);
           H[t][i]=1;   //回溯法的关键
       }
       return ;
   }  

public static boolean place(int t,int i,int s)  //检查同一列是否有相同的
{
    for(int q=t-1;q>=0;q--)
    {
        if(H[q][i]==s)return false;
    }
    for(int q=t-1,w=i-1;q>=0&&w>=0;q--,w--)   //检查主对角线    这行以下的还没放  不检查
    {
        if(H[q][w]==s)return false;
    }
    for(int q=t-1,w=i+1;q>=0&&w<=m-1;q--,w++)  //检查另一个对角线
    {
        if(H[q][w]==s)return false;
    }
    return true;
}
}
时间: 2024-10-05 05:31:29

蓝桥杯训练 2n皇后的相关文章

蓝桥杯训练 安慰奶牛 (Kruskal MST)

算法训练 安慰奶牛 时间限制:1.0s   内存限制:256.0MB 问题描述 Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续地编号为1到N.每一个牧场都是一个奶牛的家.FJ计划除去P条道路中尽可能多的道路,但是还要保持牧场之间 的连通性.你首先要决定那些道路是需要保留的N-1条道路.第j条双向道路连接了牧场Sj和Ej(1 <= Sj <= N; 1 <= Ej <= N; Sj != Ej),而且走完它需要Lj的时间.

蓝桥杯训练 最短路 (SPFA模板 vector)

算法训练 最短路 时间限制:1.0s   内存限制:256.0MB 问题描述 给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环).请你计算从1号点到其他点的最短路(顶点从1到n编号). 输入格式 第一行两个整数n, m. 接下来的m行,每行有三个整数u, v, l,表示u到v有一条长度为l的边. 输出格式 共n-1行,第i行表示1号点到i+1号点的最短路. 样例输入 3 3 1 2 -1 2 3 -1 3 1 2 样例输出 -1 -2 数据规模与约定 对于10%的数据,n

蓝桥杯训练 字串统计 (暴力+substr)

算法训练 字串统计 时间限制:1.0s   内存限制:512.0MB 问题描述 给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的. 输入格式 第一行一个数字L. 第二行是字符串S. L大于0,且不超过S的长度. 输出格式 一行,题目要求的字符串. 输入样例1: 4 bbaabbaaaaa 输出样例1: bbaa 输入样例2: 2 bbaabbaaaaa 输出样例2: aa 数据规

蓝桥杯训练中的考新郎问题

题目内容: 国庆期间,省城HZ刚刚举行了一场盛大的集体婚礼,为了使婚礼进行的丰富一些,司仪临时想出了有一个有意思的节目, 叫做"考新郎",具体的操作是这样的:首先,给每位新娘打扮得几乎一模一样,并盖上大大的红盖头随机坐成一排;然后, 让各位新郎寻找自己的新娘.每人只准找一个,并且不允许多人找一个.最后,揭开盖头,如果找错了对象就要当众跪搓 衣板.. 假设一共有N对新婚夫妇,其中有M个新郎找错了新娘,求发生这种情况一共有多少种可能. 输入描述 N M 输出描述 可能的种数 输入样例 3

蓝桥杯训练之ACM

题目内容: 现有长度为n 的字符串,该字符串只由"A","C","M"三种字符组成(可以只有其中一种或两种字符, 但绝对不能有其他字符 ),但是禁止在串中出现C 相邻的情况,求一共有多少种满足要求的不同的字符串. 例如:n=2 时,有AA,AC,AM,CA,CM,MA,MC,MM 8 种情况. 输入描述 长度整数n(n<40) 输出描述 字符串的种数 输入样例 2 输出样例 8 #include<stdio.h> #includ

蓝桥杯——算法训练之乘积最大

问题描述 今年是国际数学联盟确定的"2000--世界数学年",又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加.活动中,主持人给所有参加活动的选手出了这样一道题目: 设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大. 同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子: 有一个数字串:312, 当N=3,K=1时

蓝桥杯——真题训练之蚂蚁感冒

标题:蚂蚁感冒 长100厘米的细长直杆子上有n只蚂蚁.它们的头有的朝左,有的朝右. 每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒. 当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行. 这些蚂蚁中,有1只蚂蚁感冒了.并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁. 请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒. [数据格式] 第一行输入一个整数n (1 < n < 50), 表示蚂蚁的总数. 接着的一行是n个用空格分开的整数 Xi (-100 < Xi < 100),

【蓝桥杯】经典的八皇后问题

这个问题很经典,不清楚问题描述的可以百度一下,这里就不再赘述了,只列出我的具体做法. import java.util.ArrayList; import java.util.List; class Test8Queens { public static StringBuffer result = new StringBuffer(); public static List<Integer> list = new ArrayList<Integer>(); public stati

蓝桥杯 入门训练 Fibonacci数列(Java)

@Author : qingdujun 入门训练 Fibonacci数列  : http://lx.lanqiao.org/problem.page?gpid=T4 import java.util.Scanner; /** * 蓝桥杯: 入门训练 Fibonacci数列 * @author qingdujun * */ public class Main { public static void main(String[] args) { int f1 = 1; int f2 = 1; int