经典的K皇后问题在这里不再复述。
新问题是这样的,在一个M*N的棋盘上,放置K个皇后,其中任意两个皇后不能在同一行,不能在同一列,也不能在同一对角线,问有几种办法放置这K个皇后,废话少说,直接上程序。
#include<stdio.h>
#include<math.h>
const int MAX_LENGTH = 1000;
int M,N,K; //这里为了方便用了全局变量,M表示棋盘的行数,N表示棋盘的列数,K表示皇后个数
int methodCount;
int flag[MAX_LENGTH];//flag[i]表示第i行所放的皇后在第flag[i]列,flag[i]=-1表示该行未放皇后
bool judge(int rowNum,int colNum)
{
int i;
bool f = true;
for(i=0;i<rowNum;i++)
if(flag[i]==colNum|| (rowNum-i)==abs(colNum-flag[i]))
{
f = false;
break;
}
return f;
}
void recursive(int currentRow,int queensLeft)
{
if(queensLeft==0)
{
//已经找到一种复合条件的放置方式
methodCount++;
return;
}
else if((M-currentRow)<queensLeft)
//此处表示剩下的行数已经不足以放置还未放置完的皇后个数
return;
int i;
//对每一列试探性的放下皇后
for(i=0;i<N;i++)
if(judge(currentRow,i))
{
flag[currentRow]=i;
recursive(currentRow+1,queensLe

本文探讨了K皇后问题在M*N棋盘上的变种,要求任何两个皇后不能在同一行、列或对角线上。通过递归方法解决,但时间复杂度较高,对于较大数值的M、N和K难以得到结果。作者期待能有更高效的算法或减枝策略。
最低0.47元/天 解锁文章
2333

被折叠的 条评论
为什么被折叠?



