您的位置:首页 > 其它

递归求解N皇后

2016-07-02 15:48 190 查看
/*
*Copyright (c) 2016, 烟台大学计算机学院
*All rights reserved.
*文件名称:main.cpp
*作者:张旺华
*完成日期: 2016 年 7 月 2 日
*版本号:v1.0
*问题描述:编写一个程序递归求解n皇后
*
*/
#include <stdio.h>
#include <stdlib.h>
const int N=20;      	//最多皇后个数
int q
;            	//存放各皇后所在的列号
int count=0;          	//存放解个数
void print(int n)    	//输出一个解
{
count++;
int i;
printf("  第%d个解:",count);
for (i=1;i<=n;i++)
printf("(%d,%d) ",i,q[i]);
printf("\n");
}
int place(int k,int j) 	//测试(k,j)位置能否摆放皇后
{
int i=1;
while (i<k)       	//i=1~k-1是已放置了皇后的行
{
if ((q[i]==j) || (abs(q[i]-j)==abs(i-k)))
return 0;
i++;
}
return 1;
}
void queen(int k,int n)			//放置1-k的皇后
{
int j;
if (k>n)
print(n);         		//所有皇后放置结束
else
for (j=1;j<=n;j++) 		//在第k行上穷举每一个位置
if (place(k,j))		//在第k行上找到一个合适位置(k,j)
{
q[k]=j;
queen(k+1,n);
}
}
int main()
{
int n;     					//n存放实际皇后个数
printf(" 皇后问题(n<20) n=");
scanf("%d",&n);
if (n>20)
printf("n值太大,不能求解\n");
else
{
printf(" %d皇后问题求解如下:\n",n);
queen(1,n);
printf("\n");
}
return 0;
}

运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: