您的位置:首页 > 其它

【经典算法】八皇后问题

2009-09-07 11:05 218 查看
经典的N皇后问题,利用回溯和递归的思想解决这个问题。

#include<stdio.h>
#include<stdlib.h>
int *x;
int n;
int sum=0;
void Queen();
void Traceback(int r);
int Place(r);
void output();
int main()
{
scanf("%d",&n);
x=(int *)malloc(sizeof(int)*n);
Queen();
return 0;
}
void Queen()
{
Traceback(0);
return;
}
void Traceback(int r)
{
int i;
if(r>=n)
{
sum++;
output();
}
else
{
for(i=0;i<n;i++)
{
x[r]=i;
if(Place(r))
Traceback(r+1);
}
}
return ;
}
int Place(r)
{
int i;
for(i=0;i<r;i++)
{
if(x[r]==x[i] || abs(r-i)==abs(x[r]-x[i]))
return 0;
}
return 1;
}
void output()
{
int i,j;
printf("the number is:%d/n",sum);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(x[i]==j)
printf("*");
else
printf("#");
}
printf("/n");
}
return ;
}


非递归算法

#include "stdio.h"
#include "stdlib.h"
#include "time.h"
/**//* 记录当前的放置方案 */
int *x;
/**//* 皇后的个数N 和 方案数目 */
int n,sum=0;
/**//* 检查参数所指示的这一行皇后放置方案是否满足要求 */
int  Place(int);
/**//* 非递归的方法求取皇后放置方案 */
void Queen2(void);
/**//* 打印当前成功的放置方案 */
void PrintMethod(void);
void main(void)
{
long start,stop;
printf("input n: ");
scanf("%d",&n);
x=(int *)malloc(sizeof(int)*n);
time(&start);/**//*记录开始时间*/
Queen2();
time(&stop);/**//*记录结束时间*/
printf("/nmethod total %d /n",sum);
printf("/nuse %d seconds /n",(int)(stop-start));
}
int Place(int r)
{
int i;
for(i=0;i<r;i++){
if(x[r]==x[i] || abs(r-i)==abs(x[r]-x[i]))
return 0;
}
return 1;
}
void Queen2(void)
{
int i,k;
for(i=0;i<n;i++)
x[i]=0;
k=0;
while(1){
if(x[k]>=n){
/**//* 如果当前第K行的放置位置超出了范围,那么检查该行是否为第0行
如果是第0行,说明所有的方案都已经遍历完毕,函数返回;否则回退到前一行
*/
if(k==0) break;
x[k]=0; /**//* 下次遍历的初始位置 */
k--; /**//* 返回上一行 */
x[k]++; /**//*下一种放置方案*/
}
else if(!Place(k)){
/**//* 如果当前第K行的放置方案不满足要求,采取下一种放置方案*/
x[k]++;
}
else{
if(k==(n-1)){
/**//* 如果已经是最后一行,那么表示已经成功得到一种放置方案*/
sum++;
/**//* PrintMethod(); */
x[k]=0; /**//*下次遍历的初始位置*/
k--; /**//*返回上一行*/
x[k]++; /**//*下一种放置方案*/
}else
k++; /**//* 否则开始配置下一行的皇后 */
}
}
}
void PrintMethod(void)
{
int i,j;
printf("/nmethod %d/n",sum);
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(j==x[i]) printf("*");
else printf("#");
}
printf("/n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: