n皇后问题
2015-07-24 09:58
204 查看
n皇后问题(回溯法,未完全搞懂,先放几天)
#include<stdio.h>
#define N 15
int n; //皇后个数
int sum = 0; //可行解个数
int x
; //皇后放置的列数
int place(int k)
{
int i;
for(i=1;i<k;i++)
if(abs(k-i)==abs(x[k]-x[i]) || x[k] == x[i])
return 0;
return 1;
}
int queen(int t)
{
if(t>n && n>0) //当放置的皇后超过n时,可行解个数加1,此时n必须大于0
sum++;
else
for(int i=1;i<=n;i++)
{
x[t] = i; //标明第t个皇后放在第i列
if(place(t)) //如果可以放在某一位置,则继续放下一皇后
queen(t+1);
}
return sum;
}
int main()
{
int t;
scanf("%d",&n);
t = queen(1);
if(n == 0) //如果n=0,则可行解个数为0,这种情况一定不要忽略
t = 0;
printf("%d",t);
return 0;
}
#include<stdio.h>
#define N 15
int n; //皇后个数
int sum = 0; //可行解个数
int x
; //皇后放置的列数
int place(int k)
{
int i;
for(i=1;i<k;i++)
if(abs(k-i)==abs(x[k]-x[i]) || x[k] == x[i])
return 0;
return 1;
}
int queen(int t)
{
if(t>n && n>0) //当放置的皇后超过n时,可行解个数加1,此时n必须大于0
sum++;
else
for(int i=1;i<=n;i++)
{
x[t] = i; //标明第t个皇后放在第i列
if(place(t)) //如果可以放在某一位置,则继续放下一皇后
queen(t+1);
}
return sum;
}
int main()
{
int t;
scanf("%d",&n);
t = queen(1);
if(n == 0) //如果n=0,则可行解个数为0,这种情况一定不要忽略
t = 0;
printf("%d",t);
return 0;
}
相关文章推荐
- 目标检测程序开发(三)——级联分类器训练
- 决策树算法(matlab)
- linux下解压命令大全
- 【MySQL学习】MySQL PHP 语法
- leetCode(49):Count Primes
- 【SQL语句】 - Ctrl+3 查询表属性的存储过程
- leetCode(49):Count Primes 分类: leetCode 2015-07-24 09:58 117人阅读 评论(0) 收藏
- c++ 语法
- 在eclipse上以link方式安装CDT插件
- JAVA—Day01
- #1070 : RMQ问题再临
- FineReport制作可动态展开的组织递归树报表
- 图像分析------连通组件标记算法
- 图像分析------连通组件标记算法
- 跨平台移动开发实战一
- 数字图像处理入门(一)-基本概念
- C++ STL区间前闭后开的好处
- hdu 1150 Machine Schedule(最小点覆盖)
- ZOJ 3434 Hiiragi's Sticks
- 目标检测程序开发(二)——Boosting算法简介