n皇后問題得到的一些行與列之間的關係

在一個n*n的棋盤上面 (參考題目hdu2553

在 (↖)方向上  列 - 行 的差是相等的
 

0   1  2  3  4

-1  0  1  2  3

-2 -1  0  1  2

-3 -2 -1  0  1

-4 -3 -2 -1  0 

因爲數組的列或行不爲負數,所以要加上n來保證他不是負數

假如我們用數組保存負數肯定是不行的, 所以我們要加上 n,讓他變爲非負.


   在 (↗)方向上  列 + 行 的和是相等的


0 1 2 3 4

1 2 3 4 5

2 3 4 5 6

3 4 5 6 7

看懂了這個規律之後hdu2553這道題目就很好寫了

#include <iostream>
#include <cstring>
using namespace std;
int sum, n;
int visi[3][50];
int ans[15];

void dfs(int line)
{
	if(line == n + 1)
	{
		sum++;
		return;
	}
	for(int i = 1; i <= n; i++)//遍歷所有的列
	{
		if(!visi[0][i] && !visi[1][line+i] && !visi[2][line-i+n])//遍歷當前的列和兩條對角線所在的位置
		{
			visi[0][i] = visi[1][line+i] = visi[2][line-i+n] = true;
			dfs(line + 1);
			visi[0][i] = visi[1][line+i] = visi[2][line-i+n] = false;//記得回溯
		}
	}
}
int main()
{
	for(n = 1; n <= 10; n++)
	{
		memset(visi, false, sizeof(visi));
		sum = 0;
		dfs(1);
		ans[n] = sum;
	}
	while(cin >> n && n)
	{
		cout << ans[n] << endl;
	}
	return 0;
}

參考:https://www.cnblogs.com/chenchengxun/p/3759278.html

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