Node:向经典致敬(八皇后)
2015-07-20 09:35
716 查看
#include <iostream> #include <stdio.h> #include <algorithm> #include <string.h> #include <stack> #include <queue> #define flush(arr,i) memset(arr,i,sizeof(arr)) using namespace std; const int maxn=110; bool l[maxn], raw[maxn], r[maxn]; /* n皇后 经典回溯法,好久不敲都快忘了... 本质上类似一个栈,先满足条件的话就进入,修改值。 不满足条件就退出,把之前进入的影响消除 */ int cnt, n; void nQueen(int n, int d) { if(d == n) { cnt++; return; } for(int i = 0; i < n; i++) { //当前这个位置可以放,那么就放 if(!l[i + d] && !r[i - d + n] && !raw[i]) { //放完这个位置就不能放了 l[i + d] = r[i - d + n] = raw[i] = 1; nQueen(n, d + 1); //出栈之后这个位置又可以放了 l[i + d] = r[i - d + n] = raw[i] = 0; } } } int main() { //freopen("data.txt","r",stdin); while(scanf("%d", &n) && n) { cnt = 0; flush(l, 0), flush(raw, 0), flush(r, 0); nQueen(n, 0); printf("solve num %d\n", cnt); } return 0; }
借此复习一下DFS的回溯,典型的求排列组合代码如下:
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <stack>
#include <queue>
#define flush(arr,i) memset(arr,i,sizeof(arr))
typedef long long int64;
using namespace std;
const int maxn=25;
int n, p[maxn];
bool vis[maxn];
//输出排列和组合方案是dfs回溯思想的典型应用,两者原理完全一致
//八皇后问题也同次相当
//dfs求排列
void dfs_p(int d)
{
//每一次都输出方案
for(int i = 0; i < d; i++)
i != d - 1 ? printf("%d ", p[i]) : printf("%d\n", p[i]);
for(int i = 1; i <= n; i++)
{
if(!vis[i])
{
vis[i] = true;
p[d] = i;
dfs(d + 1);
vis[i] = false;
}
}
}
//dfs求组合
void dfs_c(int d)
{
//排好n个数之后再输出
if(d == n)
{
for(int i = 0; i < n; i++)
i != n - 1 ? printf("%d ", p[i]) : printf("%d\n", p[i]);
return;
}
for(int i = 1; i <= n; i++)
{
if(!vis[i])
{
vis[i] = true;
p[d] = i;
dfs(d + 1);
vis[i] = false;
}
}
}
int main()
{
//freopen("data.txt", "r", stdin);
while(scanf("%d", &n) != EOF)
{
flush(vis, 0);
dfs_p(0);
dfs_c(0);
}
}
相关文章推荐
- javascript递归回溯法解八皇后问题
- Javascript SHA-1:Secure Hash Algorithm
- C++实现八皇后问题的方法
- java实现八皇后问题示例分享
- python 示例分享---逻辑推理编程解决八皇后
- python基于右递归解决八皇后问题的方法
- [转]可视化的数据结构和算法
- 统计文件中不小于某一长度的单词的个数(泛型算法实现)
- 使用他人的MD5编码类,修改形成密码串
- Extracting Structured Data from Web Pages
- (译)Cocos2d_for_iPhone_1_Game_Development_Cookbook:1.13使用CCTexture2DMutable调换调色盘
- Java中3DES加密
- Refactoring Notes-Refactoring Methods(3)
- 图书馆管理程序~~不过貌似功能!!有空再修修
- trainging contest#2(2011成都现场赛)I BY Hyoga
- C/C++头文件包含内容概览
- 堆栈的应用(1) 平衡符号 C++实现
- 程序员编程艺术第一章、左旋转字符串
- 程序员编程艺术:第三章续、Top K算法问题的实现
- 程序员编程艺术:第四章、现场编写类似strstr/strcpy/strpbrk的函数