1. 程式人生 > >DFS解八皇后問題

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;
}