使用回溯法來解決n皇后問題

問題描述:

在一個N*N的棋盤上放置N個皇后,使得這N個皇后不能相互攻擊,共有多少種不同的放置方法?


#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <math.h>

int * X = NULL;
int solutionCounts = 0;

//確定第k個皇后是不是能在第X[k]列上
bool Place(int k)
{
	int i = 1;
	while(i<k)
	{
		if(X[i] == X[k] || abs(X[i] - X[k]) == abs(i - k))
		{
			return false ;
		}
		i++;
	}
	return true;
}

void Print(int * X, int n)
{
	printf("第%d種方案如下:\n", solutionCounts);
	for(int i = 1; i<=n; i++)
	{
		printf("第%d個皇后的位置爲:%d行%d列\n", i, i, X[i]);
	}
}

//其實是按一顆動態樹來採用回溯法解決
void NQueens(int n)
{
	int k = 1;
	while(k>0)
	{
		//先找準第k個皇后的位置
		X[k] = X[k]+1;
		while(X[k]<=n && Place(k) == false)
		{
			X[k] += 1;	//轉至下一列尋找合適的位置
		}
		//然後發現如果這個皇后還可以有下一個皇后擺的位置的話就繼續向下找下一個皇后的位置
		if(X[k] <= n)
		{
			if(k==n) //說明所有的皇后的位置都已經確定了
			{
				solutionCounts++;
				Print(X, n);
			}
			else
			{
				k += 1;//向下找下一個皇后的位置
				X[k] = 0;
			}
		}
		else //說明這個皇后的這條路徑已經走到頭了
			k -= 1;
	}
}

void main()
{
	int n = 0;
	puts("please input the number of queens:");
	scanf("%d",&n);
	int *columns = (int *)malloc(n*sizeof(int));
	memset((void *)columns, 0, n*sizeof(int));
	X = columns;
	NQueens(n);
}

碰到的問題:

1、還是不能根據思路很好的轉化爲代碼;

2、解決了一個在Visaul Studio2008上邊出現的一個錯誤:“沒有找到MSVCR90D.dll”,解決方法爲:

       a,選擇 菜單 Project -> 工程 Properties ,或者按 ALT+F7.打開 當前工程的 PropertyPages屬性窗口,選擇 Configuration Properties->Manifest Tool;在右邊窗口中      設置Use FAT32 Work-around 項爲 Yes.單擊確定退出.

       b,Rebuild工程,運行一切正常.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章