演算法學習回顧-皇后問題

xzhhanhan發表於2020-10-08

0.皇后問題介紹

在一個k*k方格上放置皇后,並按照國際象棋規則使得各個皇后無法吃對方,這個問題是回溯法的經典運用。對應皇后每次放置皇后使得格局變動一次,對於斜方向採用反向距離等比|x-i|=|y-j|計算,每次遍歷棋盤放置一個位置標記,最後可給出最終的解。

1.程式碼執行

#include"Include.h"
#define N 6
int sol = 0;
struct Queen
{
	int x;
	int y;
};
int B[N][N];
Queen queen[N];
void Reset(int r, int x, int y, int n)
{
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
		{
			if (fabs(i - x) == fabs(j - y) || i==x || j==y)
			{
				B[i][j] = B[i][j]+ r;
			}
		}
	}
}
//設定Disp塊檢查錯誤
void Disp()
{
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
		{
			printf("%d ", B[i][j]);
		}
		printf("\n");
	}
}
void Search()
{
	int i=0,j=0,r=0,c = -1;
	while (c >= -1)
	{
		while (j < N)
		{
			if (B[i][j] == 0)
			{
				c = c + 1;
				queen[c].x = i;
				queen[c].y = j;
				if (c == N - 1)
				{
					printf("sucesss\n");
					Disp();
					sol++;
				}
				Reset(1, i, j, N);
				r = 1;
				break;
			}
			j = j + 1;
			if (j == N)
			{
				r = 0;
			}
		}
		if (r == 0)
		{
			i = queen[c].x;
			j = queen[c].y+1;
			queen[c].x = -1;
			queen[c].y = -1;
			Reset(-1, i, j-1, N);
			c = c - 1;
		}
		else
		{
			i = i + 1;
			j = 0;
		}
	}
}
int main()
{
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
		{
			B[i][j] = 0;
		}
	}
	Search();
	printf("%d", sol);
	
}

2.結果

PS:對於6皇后可以解決,結果8皇后就跑不出來,希望大家來找茬!
在這裡插入圖片描述

相關文章