前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >n皇后问题c语言代码_求n的阶乘java代码

n皇后问题c语言代码_求n的阶乘java代码

作者头像
全栈程序员站长
发布于 2022-11-11 07:33:20
发布于 2022-11-11 07:33:20
1.6K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

问题描述:

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

输入只有一个整数n。

思路

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

方法一:递归暴力法

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

代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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的棋盘时,才去判断是否满足条件。 而我们在递归时,可以提前判断是否满足条件,如果不满足,则不用递归下去,返回上一层进行处理,这种方法称为回溯法。这个题是当我们递归的时候就去判断当前的皇后是否和前面的皇后在一条对角线上,如果在一条直线上,就不需要递归下去了,返回上一层;如果不在,就继续递归,下一个继续进行判断,直到满足条件为止。

代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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;
} 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/187628.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月30日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
蓝桥杯 试题 基础练习 2n皇后问题(包含n皇后问题讲解)
在动手解决2n皇后问题时我们首先先来解决n皇后问题,所谓皇后问题,想必大家都不陌生,就是采用回溯法来实现
杨鹏伟
2020/09/11
2K0
基础练习 2n皇后问题
  给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。
刘开心_1266679
2019/02/14
7250
n皇后问题总结_模拟退火n皇后
N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行、同一列、同一斜线上的皇后都会自动攻击)。
全栈程序员站长
2022/11/11
8610
n皇后问题总结_模拟退火n皇后
回溯算法之N皇后问题[通俗易懂]
由于皇后的位置受到上述三条规则约束,我们必须通过一些技术手段来判断当前皇后的位置是否合法。
全栈程序员站长
2022/11/11
1.1K0
人工智能基础-搜索树的扩展与n皇后问题
贪心算法也属于启发式算法的一种。贪心算法从来不关注整体,而总是选择基于当前状态下的最优解,贪心可以看成A*的一种特殊情况
DearXuan
2022/01/19
5220
人工智能基础-搜索树的扩展与n皇后问题
试题 基础练习 2n皇后问题
资源限制 内存限制:512.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述   给定一个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 运行结果:
GeekLiHua
2025/01/21
480
n皇后问题描述_启发式算法解决N皇后问题
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。 你的任务是,对于给定的N,求出有多少种合法的放置方法。
全栈程序员站长
2022/11/11
5480
n皇后问题 回溯法java_Java解决N皇后问题
按照国际象棋的规则,一个皇后可以攻击与之同一行或同一列或同一斜线上的任何棋子。
全栈程序员站长
2022/11/19
7760
n皇后问题 回溯法java_Java解决N皇后问题
回溯法之n皇后问题总结_用回溯法求解n皇后问题的思路
在nxn格的棋盘上放置彼此不受攻击的n格皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在nxn格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。
全栈程序员站长
2022/11/11
3.4K0
回溯法之n皇后问题总结_用回溯法求解n皇后问题的思路
N皇后问题(DFS)
n-皇后问题是指将 n 个皇后放在 n∗n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。
dejavu1zz
2020/10/23
4310
n皇后问题c语言代码_c语言序列求和输入两个正整数m和n
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。(即任意两个皇后都不能处于同一行、同一列或同一斜线上).
全栈程序员站长
2022/11/11
1.3K0
n皇后问题c语言代码_c语言序列求和输入两个正整数m和n
回溯法(八皇后问题)及C语言实现
回溯法,又被称为“试探法”。解决问题时,每进行一步,都是抱着试试看的态度,如果发现当前选择并不是最好的,或者这么走下去肯定达不到目标,立刻做回退操作重新选择。这种走不通就回退再走的方法就是回溯法。
全栈程序员站长
2022/09/14
8010
回溯法(八皇后问题)及C语言实现
回溯法:八皇后问题
八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。当且仅当 n = 1 或 n ≥ 4 时问题有解。
卡尔曼和玻尔兹曼谁曼
2019/01/22
7080
回溯法:八皇后问题
LeetCode51,52,从八皇后到N皇后,让你从此笑傲递归
今天的文章对应LeetCode当中的51和52两题,这两题的题面几乎完全一样,都是N皇后问题,不同的是51题要求的是所有N皇后的摆放的情况,而52题只需要求所有摆放的种数。所以我们把这两题合并在一篇文章当中分享。
TechFlow-承志
2020/04/26
8910
LeetCode51,52,从八皇后到N皇后,让你从此笑傲递归
【算法】用回溯法(backtracking algorithm)求解N皇后问题(N-Queens puzzle)
那么,我们将8皇后问题推广一下,就可以得到我们的N皇后问题了。N皇后问题是一个经典的问题,在一个NxN的棋盘上放置N个皇后,使其不能互相攻击 (同一行、同一列、同一斜线上的皇后都会自动攻击) 那么问,有多少种摆法?
短短的路走走停停
2019/05/13
10.9K0
【算法】用回溯法(backtracking algorithm)求解N皇后问题(N-Queens puzzle)
n-皇后问题
n−皇后问题是指将 n 个皇后放在 n×n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。
GeekLiHua
2025/01/21
590
n-皇后问题
LeetCode46 回溯算法求全排列,这次是真全排列
在之前的文章当中,我们讲过八皇后、回溯法,也提到了全排列,但是毕竟没有真正写过。今天的LeetCode46题正是让我们生成给定元素的全排列。
TechFlow-承志
2020/04/14
6760
每周算法练习——n皇后问题
一、八皇后问题的描述     八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。当且仅当n = 1或n ≥ 4时问题有解。(摘自维基百科)     其实这里是作为我的一个算法练习,在以前的学习中,我曾经使用过GA算法实现过八皇后问题,主要的思路是将八皇后问题转化成为一种组合优化问题
felixzhao
2018/03/16
1K0
每周算法练习——n皇后问题
N皇后
说明: N皇后问题是一个以国际象棋为背景的问题:如何能够在N×N的国际象棋棋盘上放置N个皇后,使得任何一个皇后都无法直接吃掉其他的皇后。为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。 解法: N个皇后中任意两个不能处在同一行,所以每个皇后必须占据一行,及一列。我们采用回溯法的思想去解。首先摆放好第0行皇后的位置,然后在不冲突的情况下摆放第1行皇后的位置。到第j行时,如果没有一个位置可以无冲突的摆放皇后,则回溯到第j-1行,寻找第j-1行皇后的下一个可以摆放的位置。 总结一下,用回溯法解
mathor
2018/06/22
7370
leetcode 面试题 08.12. 八皇后----回溯篇7
皇后的走法是:可以横直斜走,格数不限。因此要求皇后彼此之间不能相互攻击,等价于要求任何两个皇后都不能在同一行、同一列以及同一条斜线上。
大忽悠爱学习
2021/11/15
4800
推荐阅读
相关推荐
蓝桥杯 试题 基础练习 2n皇后问题(包含n皇后问题讲解)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文