您的位置:首页 > Web前端 > Node.js

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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  八皇后 algorithm