| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2408 人关注过本帖
标题:蓝桥杯-2n皇后问题(注:提交到ACM的有关问题)
取消只看楼主 加入收藏
TRUTH_2015
Rank: 2
等 级:论坛游民
帖 子:37
专家分:20
注 册:2015-5-13
结帖率:71.43%
收藏
已结贴  问题点数:20 回复次数:3 
蓝桥杯-2n皇后问题(注:提交到ACM的有关问题)


问题描述
  给定一个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.Scanner;

/*输入的第一行为一个整数n,表示棋盘的大小。
接下来n行,每行n个0或1的整数,如果一个整数为1,
表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。*/

public class Main {
   

    @SuppressWarnings("unused")
    private static int step = 0 ;

   

    //初始化数组
    @SuppressWarnings("resource")
    private static void setArrays(int[][]a){
        Scanner sc = new Scanner(System.in) ;
       

        for(int i =0 ;i < a.length ;++i){
            for(int j =0 ; j < a.length;++j){
                a[i][j] = sc.nextInt() ;
            }
        }
    }
   

    //打印数组
    @SuppressWarnings("unused")
    private static void printArrays(int[][]a){
       

        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < a.length; j++) {
                System.out.print(a[i][j]+" ");
            }
            System.out.println();
        }
    }
   

    //判断i,j 位置是否合法
    @SuppressWarnings("unused")
    private static boolean legalWhiteQueen(int[][]a,final int i ,final int j) {
        for(int n = 0 ;n < i ; ++n){
            for(int m = 0 ; m < a.length ; ++m){
                if(a[n][m] == 2){
                    if(Math.abs(i-n) == Math.abs(j- m) || j == m) return false;
                }else continue ;

            }
        }
        return true;
    }
   

    //判断i,j位置是否合法
    @SuppressWarnings("unused")
    private static boolean legalBlackQueen(int[][]a,final int i ,final int j) {
       

        for(int n = 0 ; n < i ; n++){
           

            for(int m = 0 ; m < a.length ;++m){
                if(a[n][m] == 3){
                    if(Math.abs(i-n) == Math.abs(j-m) || j == m)return false;
                }
            }
        }
       

        return true;
    }
   

    //TODO 其次判断黑皇后
    private static void blackQueen(int[][]a,int tag){
        if(tag == a.length){step++;/*System.out.println("step:" +step);printArrays(a);System.out.println();*/}
        else{
            for(int j = 0 ; j < a.length ; ++j){
                if(a[tag][j] != 2 && a[tag][j] != 0 ){
                    a[tag][j] = 3;
                    if(legalBlackQueen(a, tag, j)){
                        blackQueen(a, tag+1);
                    }
                    a[tag][j] = 1;
                }
            }
        }
    }
   

    // TODO 首先判断白皇后
    @SuppressWarnings("unused")
    private static void whiteQueen(int[][]a,int tag){
        if(tag == a.length)blackQueen(a, 0);
        else{
            for(int j = 0 ; j < a.length ; ++j){
                if(a[tag][j] != 0){
                    a[tag][j] = 2;
                    if(legalWhiteQueen(a, tag, j)){
                        whiteQueen(a, tag+1);
                    }
                    a[tag][j] = 1;
                }
            }
           

        }
       

       

    }
   

    @SuppressWarnings({ "unused", "resource" })
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

            int n = sc.nextInt() ;
            int[][]a = new int[n][n] ;
           

            setArrays(a);
   

            whiteQueen(a, 0);
            System.out.println(step);
           

       

    }
}

实例数据运行全部相同,但是提交出现了“运行错误”提示。请问这是为什么


搜索更多相关主题的帖子: 对角线 
2016-09-23 22:56
TRUTH_2015
Rank: 2
等 级:论坛游民
帖 子:37
专家分:20
注 册:2015-5-13
收藏
得分:0 
回复 2楼 书生牛犊
在ACM中如果不用Scanner 那么怎么输入数据,,
2016-09-24 13:37
TRUTH_2015
Rank: 2
等 级:论坛游民
帖 子:37
专家分:20
注 册:2015-5-13
收藏
得分:0 
上面的问题,,,,把数据的输入放到主函数main里面就可以通过了,这个现象的原因是什么啊!
2016-09-24 13:38
TRUTH_2015
Rank: 2
等 级:论坛游民
帖 子:37
专家分:20
注 册:2015-5-13
收藏
得分:0 
程序代码:

/*

 * 蓝桥杯-2n皇后问题

 * */

import java.util.Scanner;

/*输入的第一行为一个整数n,表示棋盘的大小。
接下来n行,每行n个0或1的整数,如果一个整数为1,
表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。*/

public class Main {
   

    @SuppressWarnings("unused")
    private static int STEP = 0 ;

   

    //判断i,j 位置是否合法
    @SuppressWarnings("unused")
    private static boolean legalWhiteQueen(int[][]a,final int i ,final int j) {
        for(int n = 0 ;n < i ; ++n){
            for(int m = 0 ; m < a.length ; ++m){
                if(a[n][m] == 2){
                    if(Math.abs(i-n) == Math.abs(j- m) || j == m) return false;
                }else continue ;

            }
        }
        return true;
    }
   

    //判断i,j位置是否合法
    @SuppressWarnings("unused")
    private static boolean legalBlackQueen(int[][]a,final int i ,final int j) {
       

        for(int n = 0 ; n < i ; n++){
           

            for(int m = 0 ; m < a.length ;++m){
                if(a[n][m] == 3){
                    if(Math.abs(i-n) == Math.abs(j-m) || j == m)return false;
                }
            }
        }
       

        return true;
    }
   

    //TODO 其次判断黑皇后
    private static void blackQueen(int[][]a,int tag){
        if(tag == a.length){STEP++;/*System.out.println("step:" +step);printArrays(a);System.out.println();*/}
        else{
            for(int j = 0 ; j < a.length ; ++j){
                if(a[tag][j] != 2 && a[tag][j] != 0 ){
                    a[tag][j] = 3;
                    if(legalBlackQueen(a, tag, j)){
                        blackQueen(a, tag+1);
                    }
                    a[tag][j] = 1;
                }
            }
        }
    }
   

    // TODO 首先判断白皇后
    @SuppressWarnings("unused")
    private static void whiteQueen(int[][]a,int tag){
        if(tag == a.length)blackQueen(a, 0);
        else{
            for(int j = 0 ; j < a.length; ++j){
                if(a[tag][j] != 0){
                    a[tag][j] = 2;
                    if(legalWhiteQueen(a, tag, j)){
                        whiteQueen(a, tag+1);
                    }
                    a[tag][j] = 1;
                }
            }
           

        }
       

       

    }
   

    @SuppressWarnings({ "unused", "resource" })
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

            int n = sc.nextInt() ;
            int[][]a = new int[n][n] ;
           

            for(int i =0 ;i < n ;++i){
                for(int j =0 ; j < n;++j){
                    a[i][j] = sc.nextInt() ;
                }
            }
            whiteQueen(a, 0);
            System.out.println(STEP);
           

       

    }
}

代码可以提交成功。。why  。。。。
2016-09-24 13:40
快速回复:蓝桥杯-2n皇后问题(注:提交到ACM的有关问题)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019426 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved