zoukankan      html  css  js  c++  java
  • C语言 · 2n皇后问题

    基础练习 2n皇后问题  
    时间限制:1.0s   内存限制:512.0MB
          
    锦囊1
    搜索算法。
    锦囊2
    先搜索n皇后的解,在拼凑成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
     1 /*
     2 测试数据: 
     3 4
     4 1 1 1 1
     5 1 1 1 1
     6 1 1 1 1
     7 1 1 1 1
     8 */
     9 #include<stdio.h>
    10 #include<string.h>
    11 #include<math.h>
    12 int hei[9];//黑皇后
    13 int bai[9];//白皇后
    14 int chessboard[9][9];//1:能放  0:不能放
    15 int count = 0;
    16 
    17 int check(int queen[],int n){//判断同一列或者两对角线是否已经放置了  
    18     for(int i=1; i<n; i++){  
    19         int judge = queen[i]-queen[n];  
    20         if(judge==0 || judge==i-n || judge==n-i){  
    21             return 0;  
    22         }  
    23     }  
    24     return 1;  
    25 }  
    26 void White(int line,int n){
    27     if(line==n+1){
    28         count++;
    29     }else{
    30         for(int i=1; i<=n; i++){
    31             if(chessboard[line][i]==1 && i!=hei[line]){
    32                 bai[line]=i;
    33                 if(check(bai,line)){
    34                     White(line+1,n);
    35                 }
    36             }
    37         }
    38     }
    39 }
    40 int Black(int line,int n){
    41     if(line == n+1){
    42         White(1,n);
    43     }else{
    44         for(int i=1;i<=n;i++){
    45             if(chessboard[line][i]==1){
    46                 hei[line]= i;
    47                 if(check(hei,line)){
    48                     Black(line+1,n);//递归下一行 
    49                 }
    50             }
    51         }
    52     }
    53 }
    54 int main(){
    55     int n;
    56     scanf("%d",&n);
    57     for(int i =1; i <= n; i++)  
    58         for(int j =1; j <= n; j++)  
    59             scanf("%d",&chessboard[i][j]);
    60     Black(1,n);
    61     printf("%d",count);
    62     return 0;
    63 }
  • 相关阅读:
    小爬麦子学院教师
    小爬糗事百科
    小爬需登录的网站之麦子学院
    小爬静态页面图片
    python正则表达式
    使用Coding.net+Hexo+node.js+git来搭建个人博客
    H5键盘事件处理
    获取页面高度等信息
    JavaScript实用的工具/类库
    DOM
  • 原文地址:https://www.cnblogs.com/panweiwei/p/6679396.html
Copyright © 2011-2022 走看看