基础练习 2n皇后问题

 1 #include<iostream>
 2 #include<math.h>
 3
 4 using namespace std;
 5 #define Len 1000
 6
 7 int b[Len][Len];
 8 int a[Len]= {0};
 9 int c[Len]= {0};
10 int count=0;
11 int m;
12 bool check(int n, int i, int k) {
13     if(b[n][i] == 0){
14         return false;
15     }
16     if(k==0) {
17         for(int j=0; j<n; j++) {
18             if( a[j] == i || fabs(n-j) == fabs(a[j] - i)) {
19                 return false;
20             }
21         }
22     } else {
23         for(int j=0; j<n; j++) {
24             if(c[j] == i || fabs(n-j) == fabs(c[j] - i)) {
25                 return false;
26             }
27         }
28     }
29     return true;
30 }
31
32
33 void f2(int n) {
34     if(n==m) {
35         count++;
36         return;
37     }
38
39     for(int i=0; i<m; i++) {
40         if(check(n, i, 1)) {
41             c[n]=i;
42             f2(n+1);
43         }
44     }
45 }
46
47 void f(int n) {
48     if(n==m) {
49         f2(0);
50
51         //count++;
52         return;
53     }
54
55     for(int i=0; i<m; i++) {
56         bool x = check(n, i, 0);
57         if(x) {
58             a[n]=i;
59             b[n][i]=0;
60             f(n+1);
61             b[n][i]=1;
62         }
63     }
64 }
65
66 int main() {
67
68     cin>>m;
69     for(int i=0; i<m; i++) {
70         for(int j=0; j<m; j++) {
71             cin>>b[i][j];
72         }
73     }
74     f(0);
75     cout<<count;
76 }

原文地址:https://www.cnblogs.com/zhishoumuguinian/p/10009760.html

时间: 2024-10-13 15:02:48

基础练习 2n皇后问题的相关文章

对八皇后的补充以及自己解决2n皇后问题代码

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

2n皇后问题

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

蓝桥--2n皇后问题(递归)--搬运+整理+注释

N皇后问题: 1 #include <iostream> 2 #include <cmath> 3 using namespace std; 4 5 int N; 6 int queenPos[100];//用来存放算好的皇后位置.最左上角是(0,0) 7 8 void NQueen(int k); 9 10 int main() 11 { 12 cin >> N; 13 NQueen(0); //从第0行开始摆皇后 14 return 0; 15 } 16 void

[蓝桥杯][基础练习VIP]2n皇后问题

时间限制: 1Sec 内存限制: 128MB 提交: 26 解决: 18 题目描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行.同一列或同一条对角线上.问总共有多少种放法?n小于等于8. 输入 输入的第一行为一个整数n,表示棋盘的大小. 接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后. 输

BASIC-27 2n皇后问题

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

蓝桥杯训练 2n皇后

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

HDOJ2553(2N皇后问题)

#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int MAX_N=100; int N; int vis[3][MAX_N]; int ans; int dp[MAX_N]; void dfs(int r, int c,int n) { if(r==n) { ans++; return ; } for(int i=0; i<n; i++) { if(

java web 开发三剑客 -------电子书

Internet,人们通常称为因特网,是当今世界上覆盖面最大和应用最广泛的网络.根据英语构词法,Internet是Inter + net,Inter-作为前缀在英语中表示“在一起,交互”,由此可知Internet的目的是让各个net交互.所以,Internet实质上是将世界上各个国家.各个网络运营商的多个网络相互连接构成的一个全球范围内的统一网,使各个网络之间能够相互到达.各个国家和运营商构建网络采用的底层技术和实现可能各不相同,但只要采用统一的上层协议(TCP/IP)就可以通过Internet

八皇后问题 递归实现 C语言 超详细 思路 基础

八皇后问题 :假设 將八个皇后放到国际象棋盘上,使其两两之间无法相互攻击.共有几种摆法? 基础知识: 国际象棋里,棋盘为8X8格. 皇后每步可以沿直线.斜线 走任意格. 思路: 1.想把8个皇后放进去,肯定最终每行只有一个皇后,每列只有一个皇后. 2.设个二维数组chess [ i ] [ j ] 模拟棋盘,cas存放摆法.i j 是表示i行j列: 写一个用于递归的函数,思路如下 3.从上往下一行行的放皇后,放下一行时从最左边(第0列)放起,如果不能放就往右挪一格再试.注意判断右边有没有越界出棋