问题描述:

有一个n*n的棋盘,在这个棋盘中放n个皇后,使得这n个皇后,任意两个皇后不在同一行,同一列,同一条对角线。例如,当n等于4时,有两种摆法。

输入只有一个整数n。

思路

如果我们是从这个n*n的棋盘中选取n个方格放皇后,再去判断是否满足条件的话,则效率会非常低,这是一个组合数∁\complement∁nn∗nn \atop n*nn∗nn​,当n等于8时,就要枚举54502232次

方法一:递归暴力法

做这个题之前,我们回想一下字符串全排列,这个和它相似,可以枚举每一行的列数,枚举完一个棋盘后,判断任意两个皇后是否在同一条线上,例如上面的摆法1(2413).这个方法的复杂度为n!

代码
#include<stdio.h>
#include<math.h>
int rank[15];//pos列i行
bool vis[15];//标记第i行是否走过
int n,cnt=0;
void dfs(int pos){if(pos==n+1){bool flag=true;for(int i=1;i<=n;i++){bool flag2=true;for(int j=i+1;j<=n;j++){//枚举任意两个皇后 if(abs(i-j)==abs(rank[i]-rank[j])){//两个皇后处于一条对角线 flag=false;flag2=false;break;}}if(flag2==false)   break;//如果一个填满情况对角线有两个或以上,则直接跳出循环 }if(flag)  cnt++;return;}for(int i=1;i<=n;i++){//枚举每一行 if(vis[i]==false){//第i行没走过 rank[pos]=i;//pos列在i行 vis[i]=true;dfs(pos+1);//递归下一列 vis[i]=false;}}
}
int main(){scanf("%d",&n);dfs(1);//从第一列开始枚举 printf("%d",cnt);return 0;
}
方法二:递归回溯法

上面的方法一是当形成一个n*n的棋盘时,才去判断是否满足条件。
而我们在递归时,可以提前判断是否满足条件,如果不满足,则不用递归下去,返回上一层进行处理,这种方法称为回溯法。这个题是当我们递归的时候就去判断当前的皇后是否和前面的皇后在一条对角线上,如果在一条直线上,就不需要递归下去了,返回上一层;如果不在,就继续递归,下一个继续进行判断,直到满足条件为止。

代码
#include<stdio.h>
#include<math.h>
int rank[20];
bool vis[20];
int n,cnt=0;
void dfs(int pos){if(pos==n+1){//递归边界条件 cnt++;return;}for(int i=1;i<=n;i++){//枚举每行 if(vis[i]==false){bool flag=true;for(int j=1;j<pos;j++){//枚举pos之前的皇后 if(abs(pos-j)==abs(i-rank[j])){flag=false;break;}}if(flag){rank[pos]=i;//pos列在i行 vis[i]=true;dfs(pos+1); vis[i]=false;}}}
}
int main(){scanf("%d",&n);dfs(1);printf("%d",cnt);return 0;
}

N皇后问题(c语言实现)相关推荐

  1. C语言编程统计八皇后问题的解的个数,八皇后问题C语言解法

    偶遇八皇后问题,随即自己写了一个仅供参考 #include #include #define SIZE 8 void Circumsribe(int(*checkerboard)[SIZE], int ...

  2. 2n皇后问题C语言实现

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

  3. 八皇后问题c语言循环,八皇后问题的12组解

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #define N 8 /*皇后数*/ typedef int bool; rot(char d[ ],char s[ ...

  4. n皇后问题c语言_用栈解决N皇后问题(C语言)

    点击上方蓝字关注"程序员Bob"呀~ 孩子不是图画练习册,你不能随心所欲涂上你想要的颜色. --<追风筝的人> 问题描述:输入一个整数n,输出对应的n皇后问题的解的个数 ...

  5. 八皇后问题--C语言学习笔记

    在下面所示的棋盘中,皇后可以攻击位于箭头所覆盖的位置的所有棋子,那么现在有八个皇后,如何放置可以让他们之间不会相互攻击呢? 本文采用回溯法,先附上维基百科上对回溯法的解释: " 回溯法(英语 ...

  6. n皇后问题c语言_九章算法 | N皇后问题

    n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击(任意两个皇后不能位于同一行,同一列,同一斜线). 给定一个整数n,返回所有不同的n皇后问题的解决方案. 每个解决方案包含一个明确的 ...

  7. 88皇后问题C语言程序设计,八皇后问题--C语言程序设计.pdf

    八皇后问题 学 2012年 9 月 5 日 目录 一.选题 1.1背景知识---------------------------2 1.2设计目的与要求------------------------ ...

  8. n皇后问题c语言报告,关于N皇后问题

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 很慢啊! #include #include /* Æå×ÓÊý¼°ÆåÅÌ´óСMAXxMAX */ #define MAX 15 int board ...

  9. 蓝桥杯Python-2n皇后问题(和别人的想法有点不一样)

    首先附上问题链接:蓝桥杯基础练习VIP-2n皇后问题 - C语言网 (dotcpp.com) 问题描述: 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使 ...

  10. 自动寻路算法C语言,bfs算法(c语言贪吃蛇自动寻路算法)

    广度优先法(BFS)算法C/C++代码,要说明和图解!谢谢! #include #define MAX 10 int front=-1,rear=-1; struct node { int value ...

最新文章

  1. 上周新闻回顾:Vista麻烦不断 Office波澜再起(2.26-3.4)
  2. PAT 乙级 1041 考试座位号
  3. 用C语言编写小学四则运算程序,用C语言编写生成小学四则运算程序
  4. android 模拟器Genymotion的安装和使用
  5. c++ primer 5th 练习11.9自己编写的答案
  6. java为什么被开发者_为什么开发者对Java 9如此的兴奋
  7. python csv数据处理_Python数据处理(1) —CSV文件数据处理
  8. Trie树kmpAC自动机后缀数组Manacher
  9. Loadrunner基本概念解析一
  10. python struct pack string_python struct pack fmt格式
  11. QQ的DLL文件修改大全!
  12. JustTrustMe 原理分析
  13. HDU 5698 瞬间移动 (2016百度之星 - 初赛(Astar Round2B) 1003)
  14. 吃透String的intern方法
  15. Plustoken重要操盘手已被遣返回国,警方正全力侦查
  16. PDF文件有密码怎么办?
  17. vue基于webpack-theme-color-replacer 线上实时修改antd element ui主题色
  18. xutils获取数据
  19. 相关性分析热点图_防老剂TMQ及6PPD价格上涨逻辑分析及后市展望
  20. LeCun:赋予机器 “常识” ,重新设计神经网络将是AI 研究重点

热门文章

  1. 哈利波特英文单词统计频率
  2. bind搭建智能DNS
  3. iPhone加码“独立王国” 有可能成摆设?
  4. 超级经典回帖专用语(转载)
  5. 朱晔的互联网架构实践心得S1E4:简单好用的监控六兄弟
  6. R语言中dim函数_R语言在医学统计中的应用基础教程
  7. php aria2离线下载器,下载神器——Aria2,打造你自己的离线下载服务器
  8. 洛谷 [P3110] 驮运
  9. 遇到一个很冷门的bug(java.lang.NoSuchMethodException问题原因及解决办法)
  10. 《2022女程序员人群洞察报告》