八皇后问题

/*
N*N的棋盘上,放置N个皇后,要求,任意两个皇后不能在同一行,同一列,同一对角线。求有多少种放法
*/
//思路:最后N个皇后肯定是每列一个,每行一个。固定行,
#include<stdio.h>
#define N 8  //8个皇后
int count = 0;//放法计数
int column[N];

//row表示第row行,column[row]表示第row行的皇后所在的列
void Queen(int row)//放置第row行的皇后,row从0---N-1
{
	if (row == N)//row==N时表示N个皇后已经全部排列完成了
	{
		count++; 
		for (int i = 0; i < N; i++)
		{
			printf("(%d,%d) ", i, column[i]);//输出皇后位置
		}
		printf("\n");
		return;
	}
	for(int i=0;i<N;i++)//从0-N-1列放置皇后
	{
		column[row] = i;//皇后位置为(row,i),row行,i列
		int ok = 1;//判断是不是进行下一次递归
		for (int j = 0; j < row; j++)//和前面row行的几个皇后比较,看列条件和对角条件是否满足
		{
			//column[row]==column[j]表示两个皇后在同一列
			//row+column[row]==j+column[j]表示两个皇后在主对角线上
			//row-column[row]==j-column[j]表示两个皇后在副对角线上
			if (column[row] == column[j] || row + column[row] == j + column[j] || row - column[row] == j - column[j])
			{
				ok = 0;
				break;//不满足的话,进行外层for的下一次循环,将row行的皇后往后放一列
			}
		}
		if (ok == 1)//防止j=row时,自动进行下一次递归
		{
			Queen(row + 1);
		}
	}
	
}

int main(void)
{
	Queen(0);
	printf("%d\n",count);
	return 0;
}
答案:92。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值