下面附上代码:添加必要的注释,其中全排列的实现看看注释应该可以看懂:
#includestdio.h
#includemath.h
#includestring.h
#includestdlib.h
int printed;
//该函数用于画图 , 这里为了节约空间则略去
//读者只需要将draw(a,k);去掉注释即可画图
void draw(int* a,int k)
{
int i,j;
for(i=0;ik;i++)
{
printf("\t");
for(j=0;jk;j++)
//有皇后输出Q,否则输出-
if(a[i]-1==j) printf("Q "); else printf("- ");
printf("\n");
}
printf("\n");
}
//递归实现全排列,a是数组,iStep是位置的测试点 , k是皇后的个数,一般等于8
void Settle(int *a,int iStep,int k)
{
int i,j,l,flag=1;
//如果iStep的数字等于a之前的数字,则存在重复 , 返回
for(i=0;iiStep-1;i++)
if(a[iStep-1]==a[i]) return;
//如果iStep==k,即递归结束到最后一位,可以验证是否斜行满足
if(iStep==k)
{
//双重循环判断是否斜行满足
for(j=0;jk;j++)
for(l=0;lkl!=j;l++)
//如果不满足,则flag=0
if(fabs(j-l)==fabs(a[j]-a[l])) flag=0;
//如果flag==1,则通过了斜行的所有测试 , 输出 。
if(flag)
{
for(i=0;ik;i++)
printf("(%d,%d) ",i+1,a[i]);
printf("\n");
//如果去掉这里的注释可以获得画图,由于空间不够,这里略去
// draw(a,k);
//printed变量计算有多少满足题意的结果 , 是全局变量
printed++;
}
flag=1;
}
//如果未测试至最后末尾 , 则测试下一位(递归)
for(i=1;i=k;i++)
{
a[iStep]=i;
Settle(a,iStep+1,k);
}
}
void main()
{
int* a;
int k;
//输入维数,建立数组
printf("Enter the size of the square:");
scanf("%d",k);
a=(int*)calloc(k,sizeof(int));
//清屏,从iStep=0处进入递归
system("cls");
Settle(a,0,k);
//判断最后是否有结果
if(! printed) printf("No answers accepted!\n");
else printf("%d states available!\n",printed);
}
附输出结果(输入k=8):
(1,1) (2,5) (3,8) (4,6) (5,3) (6,7) (7,2) (8,4)
(1,1) (2,6) (3,8) (4,3) (5,7) (6,4) (7,2) (8,5)
(1,1) (2,7) (3,4) (4,6) (5,8) (6,2) (7,5) (8,3)
(1,1) (2,7) (3,5) (4,8) (5,2) (6,4) (7,6) (8,3)
(1,2) (2,4) (3,6) (4,8) (5,3) (6,1) (7,7) (8,5)
(1,2) (2,5) (3,7) (4,1) (5,3) (6,8) (7,6) (8,4)
(1,2) (2,5) (3,7) (4,4) (5,1) (6,8) (7,6) (8,3)
(1,2) (2,6) (3,1) (4,7) (5,4) (6,8) (7,3) (8,5)
(1,2) (2,6) (3,8) (4,3) (5,1) (6,4) (7,7) (8,5)
(1,2) (2,7) (3,3) (4,6) (5,8) (6,5) (7,1) (8,4)
(1,2) (2,7) (3,5) (4,8) (5,1) (6,4) (7,6) (8,3)
(1,2) (2,8) (3,6) (4,1) (5,3) (6,5) (7,7) (8,4)
(1,3) (2,1) (3,7) (4,5) (5,8) (6,2) (7,4) (8,6)
(1,3) (2,5) (3,2) (4,8) (5,1) (6,7) (7,4) (8,6)
(1,3) (2,5) (3,2) (4,8) (5,6) (6,4) (7,7) (8,1)
(1,3) (2,5) (3,7) (4,1) (5,4) (6,2) (7,8) (8,6)
(1,3) (2,5) (3,8) (4,4) (5,1) (6,7) (7,2) (8,6)
(1,3) (2,6) (3,2) (4,5) (5,8) (6,1) (7,7) (8,4)
(1,3) (2,6) (3,2) (4,7) (5,1) (6,4) (7,8) (8,5)
(1,3) (2,6) (3,2) (4,7) (5,5) (6,1) (7,8) (8,4)
(1,3) (2,6) (3,4) (4,1) (5,8) (6,5) (7,7) (8,2)
(1,3) (2,6) (3,4) (4,2) (5,8) (6,5) (7,7) (8,1)
(1,3) (2,6) (3,8) (4,1) (5,4) (6,7) (7,5) (8,2)
(1,3) (2,6) (3,8) (4,1) (5,5) (6,7) (7,2) (8,4)
(1,3) (2,6) (3,8) (4,2) (5,4) (6,1) (7,7) (8,5)
(1,3) (2,7) (3,2) (4,8) (5,5) (6,1) (7,4) (8,6)
(1,3) (2,7) (3,2) (4,8) (5,6) (6,4) (7,1) (8,5)
(1,3) (2,8) (3,4) (4,7) (5,1) (6,6) (7,2) (8,5)
(1,4) (2,1) (3,5) (4,8) (5,2) (6,7) (7,3) (8,6)
(1,4) (2,1) (3,5) (4,8) (5,6) (6,3) (7,7) (8,2)
(1,4) (2,2) (3,5) (4,8) (5,6) (6,1) (7,3) (8,7)
推荐阅读
- 中国区块链招标,区块链项目招标
- 微信视频号音乐号操作手册,视频号 音乐
- 苹果13怎么保存视频号,ios13视频怎么保存新片段
- linux最大化命令,linux 最大化
- c语言调用不同函数 c语言在不同程序中引用函数
- linux批量解压缩命令的简单介绍
- 电脑网线tp路由器怎么设置,电脑如何设置tplink无线路由器
- 糖果手机直播间女朋友,糖果手机是正品吗
- go语言得到数组长度 go 数组作为参数