M*N棋盘上的K皇后问题

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

经典的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;
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值