從N 皇后問題看回溯法

2021-05-23 20:02:40 字數 2053 閱讀 3458

使用遞迴:

1 #include

2 #include

3 #include

4 #include

5 6

intc = 0;

7 8

intprint_queens(int*queens,intn)

9 18         printf("*");

19 20

for(j++; j < n; j++)

21         

24         printf("

/n");

25     }

26return0;

27 }

28 29

intcheck_position(int*queens,introw)

30 40     }

41return0;

42 }

43 44

intqueens_solution(int*queens,introw,intn)

45 53

else

54     

62         }

63     }

64 65

return0;

66 }

67 68

intmain()

69 ;

71     queens_solution(queens, 0, 8);

72     printf("there is

%danswers for the

%dqueen question", c,sizeof(queens) /sizeof(int));

73     getchar();

74return0;

75 } 76

如果不使用遞迴,則需要自己模擬出乙個壓棧和出棧的過程:

只需要做出如下修改即可:

1 #include

2 3

#define n 4/*

定義棋盤大小

*/4

5staticintsum; /*

當前已找到解的個數

*/6

7staticintx[n]; /*

記錄皇后的位置,x[i]=j表示皇后放在棋盤的第i行的第j列

*/8

9 10

/*確定某一位置皇后放置與否,放置則返回1,反之返回0

*/11

intplace(intk)

12 22

23 /*

列印棋局

*/24

voidchessboard()

25 34      printf("

/n");

35 }

36 37

/*回溯搜尋解空間

*/38

voidbacktrack()

39 52 }

53 54

55 56

intmain(void)

57 62

N 皇后問題 回溯法

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

回溯法 n皇后問題

問題描述 在nxn的棋盤上,放置彼此不受攻擊的n個皇后。規則 皇后可以攻擊與之在同一行,同一列,同一斜線上的棋子。以行為主導 不用再判斷是否同行了 演算法設計 1 定義問題的解空間 問題解的形式為n元組 分量xi表示第i個皇后放置在第i行,第xi列。2 解空間的組織結構 m叉樹 3 搜尋解空間 約束...

回溯法 N皇后問題

n 皇后問題研究的是如何將n 個皇后放置在 n n 的棋盤上,並且使皇后彼此之間不能相互攻擊。不能相互攻擊就是n個皇后兩兩不能同行同列同對角線。示例 輸入 4 輸出 q 解法 1 q q q.q.解法 2 q q q 解釋 4 皇后問題存在兩個不同的解法。可以利用 回溯法子集樹 模板進行求解,每個節...