[HDU 2553]--N皇后问题(回溯)/N皇后问题的分析
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2553
N皇后问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
你的任务是,对于给定的N,求出有多少种合法的放置方法。

| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| -1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
| -2 | -1 | 0 | 1 | 2 | 3 | 4 | 5 |
| -3 | -2 | -1 | 0 | 1 | 2 | 3 | 4 |
| -4 | -3 | -2 | -1 | 0 | 1 | 2 | 3 |
| -5 | -4 | -3 | -2 | -1 | 0 | 1 | 2 |
| -6 | -5 | -4 | -3 | -2 | -1 | 0 | 1 |
| -7 | -6 | -5 | -4 | -3 | -2 | -1 | 0 |
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n, vis[], cnt, ans[];
void Search(int cur){
if (cur == n) cnt++;
else for (int i = ; i < n; i++){
int flag = ;
vis[cur] = i;
for (int j = ; j < cur; j++){
if (vis[cur] == vis[j] || cur - vis[cur] == j - vis[j] || cur + vis[cur] == j + vis[j]){
flag = ;
break;
}
}
if (flag) Search(cur + );
}
}
int main(){
memset(ans, -, sizeof(ans));
while (~scanf("%d", &n), n){
//while (cin >> n, n){
cnt = ;
if (ans[n] != -){
printf("%d\n", ans[n]);
continue;
}
Search();
printf("%d\n", cnt);
ans[n] = cnt;
//cout << cnt << endl;
}
return ;
}
如果要输出排列情况,代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n, vis[], cnt,T=, ans[];
void Show(){
for (int i = ; i < n; i++){
for (int j = ; j < n; j++){
if (j) cout << ' ';
if (j == vis[i]) cout << char();
else
cout << '.';
}
cout << endl;
}
}
void Search(int cur){
if (cur == n){
cout << "Case:" << T++ << endl;
Show();
cnt++;
}
else for (int i = ; i < n; i++){
int flag = ;
vis[cur] = i;
for (int j = ; j < cur; j++){
if (vis[cur] == vis[j] || cur - vis[cur] == j - vis[j] || cur + vis[cur] == j + vis[j]){
flag = ;
break;
}
}
if (flag) Search(cur + );
}
}
int main(){
memset(ans, -, sizeof(ans));
while (cout<<"请输入皇后数:",cin >> n, n){
T = ;
cnt = ;
Search();
cout << "总排列方式:"<<cnt << endl;
}
return ;
}
[HDU 2553]--N皇后问题(回溯)/N皇后问题的分析的更多相关文章
- 八皇后问题-回溯法(MATLAB)
原创文章,转载请注明:八皇后问题-回溯法(MATLAB) By Lucio.Yang 1.问题描述 八皇后问题是十九世纪著名数学家高斯于1850年提出的.问题是:在8*8的棋盘上摆放8个皇后,使其不能 ...
- 回溯---N皇后
N 皇后 51. N-Queens (Hard) 题目描述: 在n*n的矩阵中摆放n个皇后,并且每个皇后不能在同一列,同一个对角线上,求所有的n皇后解. 思路分析: 一行一行地摆放,在确定一行 ...
- n皇后问题与2n皇后问题
n皇后问题 问题描述: 如何能够在 n×n 的棋盘上放置n个皇后,使得任何一个皇后都无法直接吃掉其他的皇后 (任两个皇后都不能处于同一条横行.纵行或斜线上) 结题思路: 可采用深度优先算法,将棋盘看成 ...
- dfs-1756:八皇后及1700:八皇后问题
总时间限制: 1000ms 内存限制: 65536kB 描述 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被 ...
- leetcode N-Queens/N-Queens II, backtracking, hdu 2553 count N-Queens, dfs 分类: leetcode hdoj 2015-07-09 02:07 102人阅读 评论(0) 收藏
for the backtracking part, thanks to the video of stanford cs106b lecture 10 by Julie Zelenski for t ...
- leetcode 51. N皇后 及 52.N皇后 II
51. N皇后 问题描述 n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回所有不同的 n 皇后 ...
- 蓝桥杯试题 基础练习 2n皇后问题以及n皇后问题
在学习2n皇后之前,我们应该认识一下n皇后问题: 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上.你的任务是,对于 ...
- HDU 2553 n皇后问题(回溯法)
DFS Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description ...
- HDU 2553 N皇后问题(回溯 + 剪枝)
本文链接:http://i.cnblogs.com/EditPosts.aspx?postid=5398797 题意: 在N*N(N <= 10)的方格棋盘放置了N个皇后,使得它们不相互攻击(即 ...
随机推荐
- 马踏棋盘问题-贪心(MATLAB&C++)
原创文章,转载请注明:马踏棋盘问题-贪心(MATLAB&C++) By Lucio.Yang 1.问题描述 将马随机放在国际象棋的Board[0-7][0-7]的某个方格中,马按走棋规则进行移 ...
- Linux 中 java 访问 windows共享目录
有两个方案: 1.将windows共享目录,挂载到linux系统下,通过使用本地目录访问windows共享目录 2.通过samba的java实现包,不过需要开个windows共享目录的账户 http ...
- 5.6.1 Boolean类型
Boolean类型是与布尔值对应的引用类型.要创建Boolean对象,可以像下面这样调用Boolean构造函数并传入true或false值. var booleanObject=new Boolean ...
- INDEX相关
1.索引应该建立在WHERE子句经常用到的表列上,如果在大表上频率使用某列或者某几列作为条件执行检索操作,并且检索的行数低于总行数的15%,那么应该考虑在该几行上添加索引. 2.为了提高多表连接的性能 ...
- ssh无密登录
ssh登录一般两种方式: 1.密码登录 2.密钥验证无需密码 使用方式:1.生成密钥 2.将公钥追加到authorized_keys中,需要注意的是执行权限需为600,这里因而第一次添加使用的是> ...
- BZOJ 1008 越狱 (组合数学)
题解:正难则反,从总数中减去全部相邻不相同的数目就是答案,n*(n-1)^(m-1):第一个房间有n中染色方案,剩下m-1个房间均只有n-1种染色方案,用总数减就是答案. #include <c ...
- java 面试 复习 II
1 break 多重 循环跳出当前循环到上层循环再执行. 如若想跳出多重循环可以使用标号 2 byte,short,char都可以隐含转换为int.可以用在switch 表达式.long和str ...
- Warning: Unable to send packet: Error with PF_PACKET send() [11]: Message too long (errno = 90)
今天在使用tcpreplay重放流量时,发现有的数据包没有发送成功: Warning: Unable to send packet: Error with PF_PACKET send() [215] ...
- 浅谈CSS布局
在No.4中谈及了下盒子模型,引出布局模型 1.布局模型有三类: 1)流动模型 flow(默认) 2)浮动模型 float 3)层模型 layer 2.文档流 :指的是文本沿着从左到右的方向展开 ...
- Android中图片处理相关问题
在Android的开发中,我们经常回去处理一些图片相关的问题,比如当加载图片到内存中产生的OOM(OutOfMemory)异常.图片加载到内存中占多大内存的问题.jpg png两种常见的图片的原理及区 ...