18124 N皇后问题
18124 N皇后问题
时间限制:2000MS 内存限制:65535K
提交次数:0 通过次数:0
题型: 编程题 语言: G++;GCC;VC
Description
有N*N的国际象棋棋盘,要求在上面放N个皇后,要求任意两个皇后不会互杀,有多少种不同的放法?
输入格式
每一个数为T,代表CASE的数量,T<=13 此后,每行一个数N(13>=N>0)
输出格式
每一个CASE,输出对应答案
输入样例
2 4 5
输出样例
2 10
作者
admin
SCAU-N皇后问题—回溯。输入n,求出在n*n的棋盘上放置n个皇后可以有多少种解;就是一个八皇后问题,而且题目的n也非常的小,时间还给了2000ms,就算暴力回溯O(n^2)的复杂度都可以过。但这里介绍一个优化上的技巧。 皇后可以攻击到同行同列和两条对角线上的棋子,,那么肯定是一行行的放置,一行和一列都是只能放置一个棋子的。 在判断同列的时候,开一个row[MAXN+5]的数组来标记哪些列放置了皇后。 对于两个对角线;要判断是否已放有棋子,就只要再开个二维的数组diagonal[2][MAXN*2+5]; 其中,y-x是主对角线,y+x是副对角线。 但y-x可能为负数,所以要写成y-x+n; 在判断到当前cur行上的位置j可以放置的话,就把diagonal[0][cur-j+n]和diagonal[1][cur+j]都标记为1 以此表示该条对角线上已经放置有棋子了。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cctype> 6 #include <cmath> 7 #include <algorithm> 8 #include <set> 9 #include <map> 10 #include <queue> 11 #include <stack> 12 #include <utility> 13 #include <vector> 14 #define ll long long 15 #define inf 0x3f3f3f3f 16 using namespace std; 17 18 int row[20],diagonal[2][30];//标记列和两条对角线的数组 19 int cnt,n; 20 void dfs(int cur) 21 { 22 if(cur==n+1) //到达递归边界 23 { 24 cnt++; 25 return; 26 } 27 for(int i=1;i<=n;i++) 28 { //判断列上、两条对角线上是否已有棋子 29 if(!row[i]&&!diagonal[0][cur+i]&&!diagonal[1][cur-i+n]) 30 { 31 row[i]=diagonal[0][cur+i]=diagonal[1][cur-i+n]=1; 32 dfs(cur+1); 33 row[i]=diagonal[0][cur+i]=diagonal[1][cur-i+n]=0; 34 } 35 } 36 } 37 int main() 38 { 39 //freopen("input.txt","r",stdin); 40 memset(row,0,sizeof(row)); 41 memset(diagonal,0,sizeof(diagonal)); 42 int t; 43 scanf("%d",&t); 44 while(t--) 45 { 46 scanf("%d",&n); 47 cnt=0; 48 dfs(1); 49 printf("%d\n",cnt); 50 } 51 return 0; 52 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)