一、N皇后问题的概念

n 皇后问题,研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。 一个皇后可以向水平、垂直以及向斜对角方向移动,如果一个皇后出现在另一个皇后的同一行,同一列或者斜对角,那它就可以被这个皇后攻击。可以通过列举出在棋盘上所有的情况,然后判断每个组合是不是符合的条件。

二、代码步骤

1、对皇后位置对错的判断

2、递归实现N皇后位置的排列

3、定义N皇后的指针并初始化

4、代码入口

5、运行结果


三、代码功能

1、对皇后位置对错的判断

bool place(int* paraSolution, int paraT)
{
	int j;
	for(j = 1;j < paraT;j++)
	{
		if(abs(paraT-j) == abs(paraSolution[paraT]-paraSolution[j]) || paraSolution[paraT] == paraSolution[j])
		return 0; 
	}
	return 1;

2、递归实现N皇后位置的排列

void backtracking(int* paraSolution,int paraN,int paraT)
{
	int i;
	if(paraT > paraN)
	{
		for(i = 1; i <= paraN; i++)
		{
			printf("%d ",paraSolution[i]);//打印出每种符合条件的情况
		}
		printf("\r\n");
	}
	else
	{
		for(i = 1;i <= paraN; i++)
		{
			paraSolution[paraT] = i;
			if(place(paraSolution,paraT))
			{
				backtracking(paraSolution,paraN,paraT+1);
			}
		}
	}
}

3、定义N皇后的指针并初始化

void nQueen(int paraN)
{
	int i;
	int* solution = (int*)malloc((paraN + 1) * sizeof(int));
	for(i = 0;i <= paraN; i++)
	{
		solution[i] = 0;
	}
	backtracking(solution, paraN ,1);
}

4、代码入口

int main()
{
	nQueen(5);
	return 1;
}

5、运行结果

1 3 5 2 4
1 4 2 5 3
2 4 1 3 5
2 5 3 1 4
3 1 4 2 5
3 5 2 4 1
4 1 3 5 2
4 2 5 3 1
5 2 4 1 3
5 3 1 4 2

四、整体代码

#include <stdio.h>
#include <malloc.h>
#include <math.h>

bool place(int* paraSolution, int paraT)
{
	int j;
	for(j = 1;j < paraT;j++)
	{
		if(abs(paraT-j) == abs(paraSolution[paraT]-paraSolution[j]) || paraSolution[paraT] == paraSolution[j])
		return 0; 
	}
	return 1;
}

void backtracking(int* paraSolution,int paraN,int paraT)
{
	int i;
	if(paraT > paraN)
	{
		for(i = 1; i <= paraN; i++)
		{
			printf("%d ",paraSolution[i]);
		}
		printf("\r\n");
	}
	else
	{
		for(i = 1;i <= paraN; i++)
		{
			paraSolution[paraT] = i;
			if(place(paraSolution,paraT))
			{
				backtracking(paraSolution,paraN,paraT+1);
			}
		}
	}
}

void nQueen(int paraN)
{
	int i;
	int* solution = (int*)malloc((paraN + 1) * sizeof(int));
	for(i = 0;i <= paraN; i++)
	{
		solution[i] = 0;
	}
	backtracking(solution, paraN ,1);
}

int main()
{
	nQueen(5);
	return 1;
}

更多推荐