本文链接:http://i.cnblogs.com/EditPosts.aspx?postid=5398797

题意:

  在N*N(N <= 10)的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。你的任务是,对于给定的N,求出有多少种合法的放置方法。

思路:

  回溯 + 剪枝,有点类似于DFS全排列。利用emp[i]表示从左往右第 i 个皇后的所在的行,从而使得所有皇后默认不在同一列。

代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
using namespace std; const int MAXN = ;
int emp[MAXN]; //emp[i] 表示从左往右 第 i 个皇后所在的行
int used[MAXN]; //标记这一行已经被使用
int n;
int cnt; //合理的解的总数 int check(int key) //判断第 key 个皇后的位置是否合理
{
if(used[ emp[key] ]) //判断 行 是否合理
return ;
for(int i = ; i < key; i++) // 判断斜着是否和合理
if( abs(i - key) == abs(emp[i] - emp[key]) )
return ;
return ;
} void backtrack(int key)
{
if(key > n) //满足条件的一个解
cnt++;
else
{
for(int i = ; i <= n; i++) //第 key 列的皇后可以有放到 1 - N 行的N种选择(状态)
{
emp[key] = i; //把第 key 个皇后放在第 i 行
if(check( key )) //合法性
{
used[i] = ; //标记这 行 已被使用
backtrack( key + ); // 继续求解下一个皇后
used[i] = ; //恢复现场
}
}
}
} int main()
{
//freopen("out.txt", "w", stdout);
while(cin >> n)
{
cnt = ;
memset(emp, , sizeof(emp));
memset(used, , sizeof(used));
backtrack(); //从第一个皇后开始放
}
return ;
}

最新文章

  1. [原]分享一下我和MongoDB与Redis那些事
  2. 1.1Axure简介
  3. javaScript DOM JQuery AJAX
  4. 72 [面试题]如果不使用if-else和比较运算符,你知道如何求解2个数字中的较大一个吗?
  5. Android之canvas详解
  6. java中文排序
  7. SCOM2007R2安装和报表服务器配置
  8. Hibernate 事件监听
  9. 2014年1月9日 Oracle 实用系统函数
  10. jQuery地图热点效应-后在弹出的提示鼠标层信息
  11. HTML5实现刮奖效果
  12. Cocos2d-android游戏引擎-介绍
  13. tablehost
  14. java 多线程机制
  15. iOS开发 Android开发 移动Web开发
  16. ReactiveCocoa_v2.5 源码解析之架构总览
  17. 利用 bat 批量处理命令实现手动控制mysql /Oracle 服务的开启和关闭
  18. pip相关工具使用小结
  19. How to enable mp3 on Ubuntu
  20. Python小练习(一)

热门文章

  1. 使用Html5shiv.js让ie支持html5
  2. WPF 利用键盘钩子来捕获键盘,做一些不为人知的事情...完整实例
  3. 关于mysqldump备份非事务表的注意事项
  4. Eclipse安装使用
  5. UnitOfWork知多少 【转】
  6. 孤荷凌寒自学python第三十五天python的文件操作之针对文件操作的os模块的相关内容
  7. 再探 KMP 算法
  8. HDU - 2814 Visible Trees
  9. [poj] 3057 Evacuation
  10. [codeforces] 359D Pair of Numbers