总结: 从N皇后问题里面的归纳深搜…
2016-05-19 23:15
375 查看
暴力枚举
(参照刘汝佳代码)
N-queens_problem-1代码 :
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
#define MAX 10001
int result = 0;
int c[MAX];
int n;
void search(int cur)
{
int i,
j;
if(cur == n)
result++;
else
{
for(i = 0; i < n;
++i) //将皇后逐行放置
{
int ok = 1;
c[cur] = i;
//第cur行的皇后放在第i列
for(j = 0; j < cur;
++j) //检查皇后冲突 纵向,两条对角线
{
if(c[cur] == c[j] || cur-c[cur] == j-c[j] ||
cur+c[cur] == j+c[j])
{
ok = 0;
break;
}
}
if(ok) search(cur+1);
}
}
}
int main()
{
//
memset(c,0,sizeof(c));
n = 8;
search(0);
printf("%d\n",result);
return
0;
}
N-queens_problem-2代码 :
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
#define MAX 1001
int vis[3][MAX];
int n;
int c[MAX];
int result = 0;
void search(int cur)
{
int i,
j;
if(cur == n)
result++; //记录结果 需要可以打印每一个结果
例如:(1,3,0,2)
else
{
for(i = 0; i < n; ++i)
{
if(!vis[0][i] &&
!vis[1][cur+i] &&
!vis[2][cur-i+n]) //直接使用二维数组判断冲突
{
//
c[cur] = i;
//需要打印结果加上
vis[0][i] = vis[1][cur+i] = vis[2][cur-i+n] =
1;
search(cur+1);
vis[0][i] = vis[1][cur+i] = vis[2][cur-i+n] =
0;
}
}
}
}
int main()
{
memset(vis,0,sizeof(vis));
result =
0;
n = 8;
search(0);
printf("%d\n",result);
return
0;
}
相关文章推荐
- 总结: 广搜 + hash(哈希搜索) (has…
- 总结: 最大连续和 递归分治法 (心…
- 总结: 求逆序对 递归分治(与poj 22…
- 总结: 数塔问题 --> dp 问题 (终…
- 总结: 0-1背包问题 --> 动态规划d…
- 图论: 并查集 + kruskal 求最小…
- 图论: 经典的邻接矩阵 + dijkstra …
- 图论: 优先队列 + dijkstra最短路…
- 图论: 邻接表 + STL优先队列 + dij…
- 图论: Bellman_ford + 队列 + 邻接…
- 图论: bellman_ford 求单源最短路…
- 图论: spfa == Shortest Path Fast…
- 图论: 匈牙利算法 Edmonds
- STL: map类的用法介绍1
- STL-Intelligent IME
- iOS app打包 -- 生成ipa测试包 步骤详解
- Linux : 线程(thread)
- Linux: 进程间通信
- Linux:网络编程 (上)
- Linux:网络编程 (下)