编辑代码

#include<stdio.h> 

int sum = 0; //方法总数
int chess[8][8]={0}; //8*8的棋盘

//判断此次放置是否合理|合理则返回1,否则返回0
int check(int row,int col)
{
	int i,j;
	for (i = 0; i < 8; i++) //判断皇后所在列
	{
		if (chess[i][col] == 1)
			return 0;
	}
	for (i = row, j = col; i >= 0 && j >= 0; i--, j--) //判断左下对角线
	{
		if (chess[i][j] == 1)
			return 0;
	}
	for (i = row, j = col; i >= 0 && j < 8; i--, j++) //判断右下对角线
	{
		if (chess[i][j] == 1)
			return 0;
	}
	return 1;
}
//打印输出结果
void print()
{
	int i,j; 
	printf("第%d种解法\n",sum+1);
	for (i = 0; i < 8; i++)
	{
		for (j = 0; j < 8; j++)
		{
			if (chess[i][j] == 1)
				printf("Q "); //皇后放置位置输出‘Q’
			else
				printf("# "); //其余位置输出‘#’
		}
		printf("\n");
	}
	printf("\n");
}
//寻找解法
void search(int row)
{
	if (row == 8) //此时0-7行均已正常放置皇后
	{
		print();
		sum++;
		return;
	}
	int col; //列
	for (col = 0; col < 8; col++) //假定将皇后放置在第row行第col列
	{
		if (check(row, col)) //若可以放置在此
		{
			chess[row][col] = 1; //修改该元素值为1
			search(row + 1); //进行下一次递归
			chess[row][col] = 0; //恢复被修改的值,否则会影响后续递归
		}
	}
}

int main()
{
	search(0);
	printf("共有%d种解法\n",sum);
	return 0;
}