N皇后排序樹 C語言 回溯法

2021-09-24 14:25:24 字數 903 閱讀 6030

題目描述

在n×n格的棋盤上放置n個皇后,任何2個皇后不放在同一行或同一列或同一斜線上

解題思路

由於n個皇后的任意兩個不能處在同一行,那麼肯定是每個皇后佔據一行,於是我們定義乙個陣列,長度為n。

陣列的第i個數字代表位於第i行的皇后的列號。先把陣列中的n個數字用(1–>n)初始化,然後對該陣列中的數字作全排列。

因為我們是用不同的數字初始化陣列,故而所有皇后肯定不同列。

因此我們只需要判斷每乙個排列對應的n個皇后是否在同一條對角線上,

也就是對於陣列的兩個下標i和j,是不是有 abs(a[i]-a[j]) = abs(i - j)。

如果成立,則該解法不滿足條件。篩選過後可以得到所有滿足條件的解法。

具體**實現

#include #include #include int n;		//皇后個數

int count; //排序結果的數量

//列印n後排序後的狀態

void printf(int data);

for(int i = 1; i<=n;i++)

printf("\n第%d種排列方式: \n",count+1);

for(int i = 1;i<=n;i++)

printf("\n");

} count++;

}void swap(int &x, int &y)

//判斷此位置是否能夠插入

int judge(int data, int k)

for(int j=1;jn)

else }

}int main()

n皇后,排列樹

package com.alo.offer public class wolfqueen n代表當前是第幾個皇后 param n 皇后n在array n 列 int a private void check int n 從第一列開始放值,然後判斷是否和本行本列本斜線有衝突,如果ok,就進入下一行的邏...

回溯法解決N皇后問題 C語言

問題描述 八皇后問題是乙個以西洋棋為背景的問題 如何能夠在 8 8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。回溯法 回溯法又稱試探法。回溯法的基本做法是深度優先搜尋。即從一條路往前走,能進則進,不能進則退回來...

N 皇后問題 回溯法

n 皇后問題 在 n n 的棋盤上放置彼此不受攻擊的 n 個皇后,任意兩個皇后不同行 不同列 不同斜線。思路 1.因為皇后不能同行,所以,在每一行放置乙個皇后就行 2.當在一行放置皇后的時候 1 順序檢查這一行每乙個位置是否和上面所有的皇后,只要有乙個同列或者在斜線上就不能放置 若找到乙個滿足的,放...