八皇后、N皇后問題的求解。

開始我還不懂啥叫回溯,寫完後一查發現好像我寫的這個就是回溯耶微笑

注:main函數第一行把輸出流定位到txt文件,可在源的目錄下查看哦

#include<cmath>
#include<iostream>
#include<stdio.h>
using namespace std;
#define N 11
int used_colunmn[N]={0};//記錄已經佔用的列
int a[N+1]={0};
int loop[N+1]={0};

void printqueen(int a[],int count)
{
	printf("\n%d:\n\n",count);//count之前多寫了一個++,這個++不會繼承下去,所以表現的就是整體的標號+1了
	for(int i=1;i<=N;i++)
	{
		printf(" _");
	}
	printf("\n");
	for(int i=1;i<=N;i++)
	{
		for(int j=1;j<a[i];j++)
			printf("|_");
		printf("|O");
		for(int j=a[i]+1;j<=N;j++)
			printf("|_");
		printf("|");
		printf("\n");
	}
}
bool ifexsist(int layer)//loop[2]==q||loop[2]==loop[1]||(abs(loop[1]-loop[2])<=1)
{
	bool judge=0;//座標(x,y).本點(loop[layer],layer),前面的點:(a[i],i)
	if(layer!=1&&abs(loop[layer]-a[layer-1])<=1)
		return 0;
	for(int i=1;i<layer;i++)
	{
		if(a[i]==loop[layer])//注意後邊的變量是loop
			return 0;
		if(abs(loop[layer]-a[i])==abs(layer-i))//不在一條斜線上
			return 0;
		//else //這個else加的…………真是一坨屎
	}
	return 1;
}

void guess_queen(int layer)
{
	if(layer>N) return;
	for(loop[layer]=1;loop[layer]<=N;loop[layer]++)//for循環迭代,loop值被修改了!!//設計的沒問題
	{		
		if(layer==1)
			memset(a,0,(N+1)*sizeof(int));
		else
		{
			if(!ifexsist(layer))
				continue;//leave
		}
		a[layer]=loop[layer];
		if(layer==N)
		{
			printqueen(a,++loop[0]);
			continue;//開始沒加continue,但是影響不大
		}
		guess_queen(layer+1);
	}
}
int main()
{
	freopen("queen.txt","w",stdout);
	printf("%d皇后問題——————\n",N);
	guess_queen(1);
}
//ifexist 犯了大錯,else寫的不是地方我還以爲那個函數沒問題
//皇后終於調試完了,加了一個對角線條件,開始還以爲寫錯了
//這個計算的方法有缺點,不能求出排除對稱的、旋轉的解!
//另外算法複雜度爲n^n,不知道最好的解法速度如何?
這個問題最開始我是求解5皇后,考慮的是該如何遍歷各種可能的情況。

後來選擇了用一維數組而不是二維數組,因爲二維數組兩個for嵌套,太臃腫了。

於是定義一個a[ ],其中元素的值代表所在的列數。也就是說,例如a[5+1]={0,1,2,3,4,5}就是對角線的排布。

然後嵌套了5層循環(好吧因爲用一維數組確實不好思考)………

5皇后的問題搞定,下面的工作就是define一個N以能夠實現n皇后問題。

然後欠的債早晚要還,開始把5層循環修改成迭代結構。

改迭代的時候出了一些問題,都在程序裏註釋了。中午睡了個覺腦子抽了把判斷是否是解的函數ifexsist中多加了個else……


不過最終還是寫好了!~!啥也沒參考純手寫時間複雜度O(n^n)空間複雜度O(n)


附上解的個數——

解的個數

下表給出了 n 皇后問題的解的個數包括獨立解UOEIS中的數列A002562)以及互不相同的解DOEIS中的數列A000170)的個數:

n

1

2

3

4

5

6

7

8

9

10

11

12

13

14

..

24

25

26

U:

1

0

0

1

2

1

6

12

46

92

341

1,787

9,233

45,752

..

28,439,272,956,934

275,986,683,743,434

2,789,712,466,510,289

D:

1

0

0

2

10

4

40

92

352

724

2,680

14,200

73,712

365,596

..

227,514,171,973,736

2,207,893,435,808,352

22,317,699,616,364,044



不自量力的跑了一下25皇后…………太漫長了

然後還是跑14皇后吧!跑完之後發現txt竟然有166MB。。。

貼圖紀念一下



發佈了49 篇原創文章 · 獲贊 6 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章