DFS解八皇后问题

仔细思考深度优先搜索其实可以分为大概四步.

1.发现,找到想要找的节点,如八皇后就是找到当前行放置皇后的那个点,马走日就是下一步的落点.

2.递进,如果不满足结束条件就继续递归,进入下一层.如八皇后问题就是进入下一行.

3.满足,条件满足了之后,就输出结果,一般都是用一个全局变量来控制数量,一旦==N,就输出结果.

4.返回,dfs得回溯才能遍历所有的结果.


问题描述
八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?
也就是说,使得棋盘中每个横向、纵向、左上至右下斜向、右上至左下斜向均只有一枚皇后。


代码如下:

#include"stdio.h"
#include"math.h"
const int N = 8;
int a[N] = {0};
int solution = 0;

bool isok(int row,int col)//判断这个位置是否可以放置皇后
{
	for (int i = 0; i < row; i++)
	{
		//a[i]的值代表着列,i代表着行,所以重0开始遍历验证行和列有没有重复的
		if(a[i] == col || abs(a[i] - col) == row - i)
		{
			return false;
		}
	}	

}


void Display()//如果数组中个数到达了N个则输出,相当于dfs的结束条件
{
	printf("第%d种解: \n",++soulution);
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
		{
			if (a[i] == j)
			{
				printf("%d",i);
			}
			else
			{
				printf("#");
			}
		}
		printf("\n");
	}
	printf("---------------------\n");
}

/*
从0,0这个位置开始循环,因为注定每一行都会有一个皇后,所以在第0行就有8种放法,之后依次下移.
相当于递归,结束条件就是row=N-1,也就是每一行都放了一个皇后,相当于一种解法.

*/
void DFS(int row)
{
	for(int col = 0;col < N;col++)
	{
		if (isok(row,col))
		{
			a[row] = col;
			if (row != N-1)
			{
				DFS(row + 1);
			}
			else
			{
				Display();
			}
		}
	}
}

int main()
{
	DFS(0);
	return 0;
}


你可能感兴趣的:(数据结构算法学习)