试题 基础练习 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

分析

解决2n皇后问题的前提是对n皇后问题有较好的理解,由于直接枚举的数量过多,会超过时间限制,在这里选择的深度优先的递归和回溯。
对于n皇后问题的解决可以参考我的上篇博客n皇后问题的C语言实现
学会了n皇后问题的思想,再解决2n皇后问题就简单的多。
先递归找到所有符合条件的黑皇后(或白皇后),在其基础上再遍历白皇后,符合条件的情况count加一。

实现过程如下:

#include<stdio.h>
#include<math.h>
#include<windows.h>
#define N 10int map[N][N];
int WhiteQueen[N],BlackQueen[N];
int count,n;void white_dfs(int row);
void black_dfs(int row);
int check(int tmp[],int x,int y);int main()
{scanf("%d",&n);int i,j;for(i=0; i<n; i++){for(j=0; j<n; j++){scanf("%d",&map[i+1][j+1]);}}black_dfs(1);printf("%d",count);return 0;
}void black_dfs(int row)
{if(row==n+1)white_dfs(1);int col;for(col=1; col<=n; col++){if(map[row][col]==0)continue;if(check(BlackQueen,row,col)){BlackQueen[row]=col;black_dfs(row+1);}}return;
}
void white_dfs(int row)
{if(row==n+1){count++;return;}int col;for(col=1; col<=n; col++){if(map[row][col]==0)continue;else if(BlackQueen[row]==col)continue;else{if(check(WhiteQueen,row,col)){WhiteQueen[row]=col;white_dfs(row+1);}}}return;
}int check(int tmp[],int x,int y)
{int flag=1,res,i;for(i=1; i<x&&flag; i++){res=tmp[i];if(res==y||abs(x-i)==abs(y-res)){flag=0;}}return flag;
}

2n皇后问题C语言实现相关推荐

  1. python【蓝桥杯vip练习题库】BASIC-27 2n皇后问题(八皇后问题 搜索)

    试题 基础练习 2n皇后问题 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个 ...

  2. 蓝桥杯 基础练习 2n皇后

    目   录 题目描述 题解 [算法]八皇后,蓝桥杯2n皇后 算法思路详细讲解(Java) 题目描述 题目描述 给定一个 n × n 的棋盘,棋盘中有一些位置不能放皇后. 现在要向棋盘中放入 n 个黑皇 ...

  3. 2n皇后 - 回溯

    题目地址:http://www.51cpc.com/web/problem.php?id=1172 Summarize: 1. 递归回溯: 2. 先扫完一种皇后,再扫描另一种: 3. 循环输入: 4. ...

  4. 解题报告——蓝桥杯 试题 基础练习 2n皇后问题(附n皇后代码)

    心路历程: 之前并没有系统的学过递归和搜索,在学这道题前先学习了深搜.递归,并敲掉了经典N皇后,因此理解起来难度也不是很大. 没有基础的同学一定要先把N皇后看会在碰这道题.下面会有N皇后逐步讲解的视频 ...

  5. 蓝桥杯算法提高----2n皇后

    2n皇后 问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行.同 ...

  6. 2n皇后问题(dfs)

    2n皇后问题 题目描述 问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都 ...

  7. 蓝桥杯 基础练习 2n皇后问题(从n皇后问题入手)

    n皇后问题是一个以国际象棋为背景的问题:在n×n的国际象棋棋盘上放置n个皇后,使得任何一个皇后都无法直接吃掉其他的皇后,即任意两个皇后都不能处于同一条横行.纵行或斜线上. 利用递归和回溯算法轻松解决 ...

  8. 蓝桥杯 BASIC-27 基础练习 2n皇后问题

    问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行.同一列或同一 ...

  9. 皇后问题,8皇后、n皇后、2n皇后

    8皇后问题 问题描述: 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例. 该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出: 在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意 ...

最新文章

  1. PHP(四)——性能优化
  2. C++17新特性学习笔记
  3. 产品开发项目中文档的重要性
  4. Kubernetes集群安全:Api Server认证
  5. 初级第七课——模拟计算器
  6. shell习题第26题:监控mysql服务
  7. scara机器人动荷载_揭密SCARA机器人
  8. oracle cude报错,转载oracle rollup和cube函数使用心得
  9. 模拟实现库函数之字符串函数
  10. 嵌入式 配置arm工具链
  11. 多核cpu的缓存一致性
  12. Codeforces Round #829 cf1753A Cowardly Rooks
  13. 集中派发福利:《神秘的程序员们》年度大抽奖
  14. nginx笔记1:nginx指令与上下文
  15. 5G/NR 下行物理信道之PDCCH概要
  16. 世界杯征文活动获奖名单
  17. 打飞机游戏 js 实现
  18. ReentrantReadWriteLock读写锁(读多写少场景)
  19. 【RFC7323 高性能的TCP扩展】(翻译)
  20. 用Qt设计一个图片浏览器

热门文章

  1. 将USDT赶下铁王座 |链捕手
  2. Linux环境下开发板Tiny4412应用,实现交叉编译及minicom的调配,将代码编译后下载到开发板并运行
  3. 无聊使用python画一个笛卡尔心
  4. 《摩根写给儿子的32封信》10 不断汲取新经验
  5. ADAS相关的一些汽车术语
  6. 制定一个长远的目标,做好职业规划
  7. 【网络通信 -- 直播】音视频常见封装格式 -- MEPG2 TS
  8. 带动猜你喜欢流量的方法,,如何给新品打标,使得新品快速入池猜你喜欢
  9. python循环画简单烟花_如何用python画烟花
  10. python引用turtle画烟花_代码也浪漫:用Python放一场烟花秀!