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 }

 

posted @ 2017-04-07 17:58  人间烟火地三鲜  阅读(1425)  评论(1编辑  收藏  举报