(Java蓝桥杯算法)现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。

18 篇文章 0 订阅
16 篇文章 0 订阅

【问题描述】

给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。

【输入格式】

输入的第一行为一个整数n,表示棋盘的大小。

接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。

【输出格式】

输出一个整数,表示总共有多少种放法。

【样例输入1】

4

1 1 1 1

1 1 1 1

1 1 1 1

1 1 1 1

【样例输出1】

2

【样例输入2】

4

1 0 1 1

1 1 1 1

1 1 1 1

1 1 1 1

【样例输出2】

0

并没有完全按照题目上要求来,虽然有点长但是思路明白了就很简单,分享给大家!

import java.util.ArrayList;
import java.util.Scanner;

/*
    0 1 2 0
	2 0 0 1
	1 0 0 2
	0 2 1 0
	-------
	0 2 1 0 
	1 0 0 2 
	2 0 0 1 
	0 1 2 0
 */
public class queen {
    public static void main(String[] args) {
        Scanner scanner =new Scanner(System.in);
        int num=scanner.nextInt();
        ArrayList<int[][]> arrayList=new ArrayList<>();
        int heinum=0;
        int bainum=0;
        int sum=0;
        int hei=0;
        int interval=0;
        int bai=1;
        while(hei<(num*num-1)) {
            heinum=0;
            bainum=0;
            int[][] arr=new int[num][num];
            for(int i=0;i<num;i++) {
                for(int j=0;j<num;j++) {
                    if(hei/num==i && hei%num==j) {
                        arr[i][j]=1;
                        heinum++;
                    }
                    if(bai/num==i && bai%num==j) {
                        arr[i][j]=2;
                        bainum++;
                    }
                }
            }
            for(int i=0;i<num;i++) {
                for(int j=0;j<num;j++) {
                    if(arr[i][j]==0) {
                        if(hang(arr,i,j, 1)) {
                            arr[i][j]=1;
                            heinum++;
                        }
                    }
                }
            }
            for(int i=0;i<num;i++) {
                for(int j=0;j<num;j++) {
                    if(arr[i][j]==0) {
                        if(hang(arr,i,j, 2)) {
                            arr[i][j]=2;
                            bainum++;
                        }
                    }
                }
            }
            if(heinum==num && bainum==num) {
                boolean boo=true;
                for(int i=0;i<arrayList.size();i++){
                    boo=true;
                    for(int j=0;j<arr.length;j++){
                        for(int k=0;k<arr.length;k++){
                            if (arrayList.get(i)[j][k]!=arr[j][k]){
                                boo=false;
                                j=arr.length;
                                k=arr.length;
                            }
                        }
                    }
                    if (boo==true){
                        i=arrayList.size();
                    }
                }
                if (boo==false){
                    for(int i=0;i<num;i++) {
                        for(int j=0;j<num;j++) {
                            System.out.print(arr[i][j]);
                            System.out.print(" ");
                        }
                        System.out.println();
                    }
                    System.out.println("-------");
                    arrayList.add(arr);
                    sum++;
                }
                if (sum==0){
                    for(int i=0;i<num;i++) {
                        for(int j=0;j<num;j++) {
                            System.out.print(arr[i][j]);
                            System.out.print(" ");
                        }
                        System.out.println();
                    }
                    System.out.println("-------");
                    arrayList.add(arr);
                    sum++;
                }
            }
            interval++;
            bai=bai+1;
            if(bai==num*num) {
                hei++;
                interval=0;
                bai=hei+1;
            }
        }
        System.out.println(sum);

    }

    public static boolean hang(int[][] arr,int a,int b,int value) {
        boolean hang=true;
        for(int i=0;i<arr.length;i++) {
            if(arr[a][i]==value) {
                hang=false;
            }
            if(arr[i][b]==value) {
                hang=false;
            }
        }
        int min=a;
        if(a>b) {
            int a2=a-b;
            int b2=0;
            min=b;
            while(a2!=arr.length && b2!=arr.length) {
                if(arr[a2][b2]==value) {
                    hang=false;
                }
                a2++;
                b2++;
            }

        }else if(a<b) {
            int a2=0;
            int b2=b-a;
            while(a2!=arr.length && b2!=arr.length) {
                if(arr[a2][b2]==value) {
                    hang=false;
                }
                a2++;
                b2++;
            }
        }else if(a==b) {
            int a2=0;
            int b2=0;
            while(a2!=arr.length && b2!=arr.length) {
                if(arr[a2][b2]==value) {
                    hang=false;
                }
                a2++;
                b2++;
            }
        }
        if(a+b<3) {
            int a3=a+b;
            int b3=0;
            while(a3!=-1 && b3!=arr.length) {
                if(arr[a3][b3]==value) {
                    hang=false;
                }
                a3=a3-1;
                b3=b3+1;
            }
        }else if(a+b>3) {
            int a3=arr.length-1;
            int b3=(a+b)%(arr.length-1);
            while(a3!=-1 && b3!=arr.length) {
                if(arr[a3][b3]==value) {
                    hang=false;
                }
                a3=a3-1;
                b3=b3+1;
            }
        }else if((a+b)==3) {
            int a3=arr.length-1;
            int b3=0;
            while(a3!=-1 && b3!=arr.length) {
                if(arr[a3][b3]==value) {
                    hang=false;
                }
                a3=a3-1;
                b3=b3+1;
            }
        }
        return hang;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 这是一个经典的问题,也称为“八皇后问题”的扩展。我们可以使用回溯算法来解决这个问题。具体来说,我们可以从第一开始,依次尝试在每一放置一个皇后和一个白皇后,然后递归到下一。在递归过程,我们需要检查当前位置是否可以放置皇后,如果可以,就继续递归下一;如果不,就回溯到上一,尝试在下一放置皇后。 为了检查当前位置是否可以放置皇后,我们需要维护三个数组:数组、对角线数组和反对角线数组。数组表示每一是否已经有皇后对角线数组表示每一条从左上到右下的对角线是否已经有皇后,反对角线数组表示每一条从右上到左下的对角线是否已经有皇后。当我们要在第i第j放置皇后时,我们需要检查数组、对角线数组和反对角线数组第j个元素、第i+j个元素和第i-j+n-1个元素是否为,如果都是,就可以放置皇后。 当我们成功放置n个皇后和n个白皇后时,就找到了一组解。如果我们要找到所有解,就需要继续递归下去,直到放置完所有皇后。如果我们只需要找到一组解,就可以在找到第一组解后立即返回。 ### 回答2: 题目要求在一个给定大小的棋盘上放置各n个的皇后,并且要求皇后皇后互相不在同一同一同一对角线上。我们可以采用回溯法来解决这个问题。 回溯法是一种深度优先搜索的方法,它将搜索策略建立在试错的基础上,每次在搜索到某一状态时,会尝试所有可能的情况,如果发现当前情况无法满足要求,则返回上一个状态重新搜索。具体的,我们可以使用一个二维数组来表示当前状态下棋盘皇后的位置。 首先,我们需要确定如何判断皇后皇后是否在同一同一同一对角线上。对于同一同一的情况,我们可以在每一和每一分别放置一个皇后,并记录下已经占用的。对于同一对角线的情况,我们可以将棋盘上的每一条线(即包含至少一个棋子的横线、竖线和斜线)都看成一条链,然后使用链表数据结构来维护每条链已经占用的位置。具体的,我们可以为每条链(根据位置确定)创建一个链表,每次放置新的皇后时,就将它加入对应链表,并检查是否与已有的皇后冲突。 接下来,我们可以使用递归函数来进搜索。具体的,我们可以从每一开始,依次枚举每一,并判断当前位置是否可以放置皇后皇后。如果可以放置皇后,则记录下当前状态,并尝试在下一放置另一种颜色的皇后。如果所有皇后都放置完成,则表示已经找到一组符合要求的方案,输出并返回。如果当前状态无法放置皇后,则返回上一个状态。 具体的代码实现比较繁琐,这里不再赘述。总的来说,该问题可以通过回溯法来解决,难点在于如何判断皇后是否在同一对角线上,以及如何确定搜索策略。 ### 回答3: 这是一个经典的问题,叫做"N皇后问题",只不过这里要求放置的皇后颜色不同。解决此问题的常见方法是采用回溯算法。 回溯算法的基本思路是从棋盘的第一开始放置皇后,每次放置后判断是否符合要求,如果符合要求,就转到下一继续放置。如果当前的所有位置都不能放置皇后,那么就需要回溯到上一,重新选择可的位置放置皇后,直到找到合适的方案或者所有可能的方案都被尝试过。 对于这道题要特别注意,皇后皇后需要互相独立,可以分别采用回溯算法来放置。同时,对于不能放置皇后的位置,需要对算法一些修改,以避开这些位置。 具体而言,可以先建立一个n*n的棋盘数组,将初始值全部设为0,表示所有位置都可以放置皇后。然后将不能放置皇后的位置的值设置为-1,表示这些位置不可用。接着,从第一开始逐放置皇后,对于每一,从左往右逐个检查是否可,如果有可的位置,则在该位置放置皇后,并修改该和两条对角线上的值。这样,对于下一放置皇后时,只需要在值为0的位置上放置即可。 在实现过程,还需要注意回溯的实现,即在每一次选择之后,都需要重新恢复之前状态的值。否则可能会出现重复计算的问题,导致算法效率降低。 总之,这是一道比较复杂的算法问题,需要耐心和认真地思考和实现。通过这道题的练习,可以加深对回溯算法和递归思想的理解和掌握。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Code丶Q

关注我,每天更新Java蓝桥题

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值