前言
个人小记
一、n后问题是什么?
在nxn格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在nxn格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同斜线上。
要求:随机输入正整数n,求出n后问题的解法个数,以及棋盘。
二、代码
#include<stdio.h>
#include <stdlib.h>
int issafe(int *pos,int row,int col)
{
for(int i=0;i<row;i++)
{
if(pos[i]==col||abs(i-row)==abs(pos[i]-col))
return 0;
}
return 1;
}
void print(int *pos,int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(pos[i]==j)printf(" Q");
printf(" 1");
}
printf("\n");
}
printf("\n\n");
}
int count=0;
void solvenQ(int *pos,int row,int n)
{
if(row==n)
{
print(pos,n);
count++;
return ;
}
for(int col=0;col<n;col++)
{
if(issafe(pos,row,col))
{
pos[row]=col;
solvenQ(pos,row+1,n);
}
}
}
int main()
{
int n;
printf("请输入皇后的个数:");
scanf("%d",&n);
int* pos=(int *)malloc(sizeof(int )*n);
for(int i=0;i<n;i++)
{
pos[i]=1; //初始化位置
}
solvenQ(pos,0,n);
printf("解的数量为:%d\n",count);
free(pos);
return 0;
}
二、运行结果
请输入皇后的个数:4
1 Q 1 1 1
1 1 1 Q 1
Q 1 1 1 1
1 1 Q 1 1
1 1 Q 1 1
Q 1 1 1 1
1 1 1 Q 1
1 Q 1 1 1
解的数量为:2