算法—n皇后问题(回朔法)

回朔法(可称通用解题法)

例子:N皇后问题

描述:N*N棋盘上无冲突的摆放N个皇后棋子,在国际象棋里皇后移动方式为横竖交叉的,求有几种解法

思路:解空间树,从根节点出发,深度搜索整个树

 

 

附上解四皇后问题的代码

#include<stdio.h>
int count = 0;
int isCorrect(int i, int j, int(*Q)[4])
{
	int s, t;
	for(s =i,t= 0;t<4;t++)
	if(Q[s][t] == 1 && t!=j)	return 0;	//判断行
	 
	for(t =j,s= 0;s<4;s++)
	if(Q[s][t] == 1 && s!=i)	return 0;	//判断列
	
	for(s =i-1,t= j-1; s>=0 && t>=0; s--,t--)
	if(Q[s][t] == 1)	return 0;			//判断左上方

	for(s =i+1,t= j+1; s<4 && t<4; s++,t++)
	if(Q[s][t] == 1)	return 0;			//判断右下方
	
	for(s =i-1,t= j+1; s>=0 && t<4; s--,t++)
	if(Q[s][t] == 1)	return 0;			//判断右上方
	
	for(s =i+1,t= j-1; s<4 && t>=0; s++,t--)
	if(Q[s][t] == 1)	return 0;			//判断左下方
	
	return 1;								//否则返回1 
}


void Queen(int j, int (*Q)[4])
{
	int i, k;
	if(j==4)
	{
		for(i=0; i<4; i++)
		{
			for(k=0; k<4; k++)
			{
				printf("%d ", Q[i][k]);
			}
			printf("\n");
		}
		printf("\n");
		//getche();
		count++;
		return; 
	}
	for(i=0; i<4; i++)
	{
		if(isCorrect(i,j,Q))
		{
			Q[i][j] = 1;
			Queen(j+1,Q);
			Q[i][j] = 0;
		}
	}	
}
int main()
{
	int Q[4][4];
	int i,j;
	for(i=0; i<4; i++){
		for(j=0; j<4; j++)
		{
			Q[i][j]=0;
		}
	}
	Queen(0,Q);
	printf("皇后问题解的个数为%d",count);
	return 0;
} 



 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值