hdu2553 N皇后问题(dfs+回溯)
2024-08-27 20:08:37
N皇后问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 33731 Accepted Submission(s): 14463
Problem Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1
8
5
0
Sample Output
1
92
10
ps 不打表会超时
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int a[][];
int result[];
int n,cnt; int panduan(int x,int y)
{
int i,j;
for(i=;i<y;i++)
if(a[x][i])//如果同一行有被标记过的点
return ;
for( i=x-,j=y-;i>=&&j>=;i--,j--)//如果主对角线有被标记过的点
if(a[i][j])
return ;
for(i=x+,j=y-;i<n&&j>=;i++,j--)//副对角线
if(a[i][j])
return ;
return ;
} void dfs(int m)
{
if(m==n)//n是全局变量
cnt++;
for(int i=;i<n;i++)
{
if(a[i][m]==&&panduan(i,m))
{
a[i][m]=;
dfs(m+);
a[i][m]=;//回溯
}
}
} int main()
{
for(int i=;i<;i++)
{
cnt=;
n=i+;
memset(a,,sizeof(a));
dfs();
result[i]=cnt;
}
while(cin>>n&&n)
{
cout<<result[n-]<<endl;
}
return ;
}
最新文章
- FastReport4.6 组件安装
- Centos 7 安装LAMP环境
- startActivityForResult用法详解
- Java学习笔记之:Java Map集合
- Labview中局部变量和全局变量
- 手机变为电脑的摄像头,使像素高清起来-使用DroidCam
- Activity---Fragment---listView的实现
- 文件操作IO流
- 发展,需求驱动 &;#183; 一间 所见即所得
- 【渗透笔记】拿下某小H网的全过程
- Docker(二):Docker镜像使用
- ES6 对象的扩展(下)
- iOS中的NSURLProtocol
- Ubuntu下安装Texmaker的问题与解决方案
- JAVA WEB快速入门之环境搭建
- QT连接postgreSQL
- P1156 垃圾陷阱 DP
- kivy 使用webview加载网页
- Leetcode 949. 给定数字能组成的最大时间
- Java基础知识学习笔记(一)