日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

回溯算法--8皇后问题

發布時間:2023/12/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 回溯算法--8皇后问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前些天有同學去跑社招,面試的時候被人問到8皇后問題,很是杯具。這也說明我們平時對于經典的算法問題關注太少,但設計算法的能力也不是一日之功,需要的是長期的練習和鍛煉提高,比如我就很需要鍛煉啊,哈哈。

廢話不多說,來分析一下問題。

8皇后問題是要在8*8的國際象棋棋盤上放8個皇后,使得任意兩個皇后都不能互相吃掉。因為皇后可以吃掉同一行、同一列和同一對角線上的任意棋子,類似于中國象棋的車。求出所有問題解。

這里可以設8個皇后,她們分別在不同的行i(i=1,2,3,4,...,8),而不同的皇后x要在的列,因此解可以有8個點所組成的二維數組。

回溯算法簡單來說,就是走不通就掉頭再走。這里就簡單的使用八重循環進行深度優先搜索,從第一個皇后開始,再找第二個;每找一個就檢查是否滿足不能被吃掉的約束條件,不滿足就continue回溯到上一個皇后,然后繼續再嘗試下一個。

不被吃掉的條件有三個:

1)不在同一列:xi != xj

2)不在同一對角線:xi - i !=xj - j && xi?+ i !=xj?+ j

EightQueens類:

View Code 1 package com.mnid.algorithm;
2 public class EightQueens {
3
4 private int a[] = new int[9];
5
6 public void place() {
7 for (a[1] = 1; a[1] <= 8; a[1] += 1) {
8 for (a[2] = 1; a[2] <= 8; a[2] += 1) {
9 if (check(a, 2))
10 continue;
11 for (a[3] = 1; a[3] <= 8; a[3] += 1) {
12 if (check(a, 3))
13 continue;
14 for (a[4] = 1; a[4] <= 8; a[4] += 1) {
15 if (check(a, 4))
16 continue;
17 for (a[5] = 1; a[5] <= 8; a[5] += 1) {
18 if (check(a, 5))
19 continue;
20 for (a[6] = 1; a[6] <= 8; a[6] += 1) {
21 if (check(a, 6))
22 continue;
23 for (a[7] = 1; a[7] <= 8; a[7] += 1) {
24 if (check(a, 7))
25 continue;
26 for (a[8] = 1; a[8] <= 8; a[8] += 1) {
27 if (check(a, 8))
28 continue;
29 else {
30 for (int i = 1; i <= 8; i++) {
31 System.out.println("(" + i
32 + ", " + a[i] + ")");
33 if (8 == i) {
34 System.out.println("-----------------");
35 }
36 }
37 }
38 }
39 }
40 }
41 }
42 }
43 }
44 }
45 }
46 }
47
48 private boolean check(int[] a, int n) {
49 for (int i = 1; i <= n - 1; i++) {
50 if (Math.abs(a[i] - a[n]) == Math.abs(i - n) || a[i] == a[n]) {
51 return true;
52 }
53 }
54 return false;
55 }
56 }

這個算法缺陷就是只能解決8皇后問題。

?

對于n皇后問題,以下是采用非遞歸的深度優先搜索算法實現:

NQueens類:

View Code 1 package com.mnid.algorithm;
2
3 public class NQueens {
4 private int a[] = new int[20];
5
6 public void place(int n) {
7 int k = 1;
8 while (k > 0) {
9 a[k] += 1;
10 while (a[k] <= n && check(k)) { //放第k個皇后
11 a[k] += 1;
12 }
13 if (a[k] <= n) {
14 if (k == n) { //找到一組解
15 print(n);
16 }else {
17 k += 1; //前k個皇后已放好,繼續放第k+1個皇后
18 a[k] = 0; //從頭開始繼續放下一個
19 }
20 } else {
21 k -= 1; //出界則回溯
22 }
23 }
24 }
25
26 private void print(int n) {
27 for (int i=1; i<=n; i++) {
28 System.out.println("(" + i
29 + ", " + a[i] + ")");
30 if (n == i) {
31 System.out.println("-----------------");
32 }
33 }
34 }
35
36 private boolean check(int n) {
37 for (int i = 1; i <= n - 1; i++) {
38 if (Math.abs(a[i] - a[n]) == Math.abs(i - n) || a[i] == a[n]) {
39 return true;
40 }
41 }
42 return false;
43 }
44 }


Placer類:

View Code 1 package com.mnid.algorithm;
2
3 public class Placer {
4 public static void main(String[] args) {
5 new EightQueens().place();
6 // new NQueens().place(8);
7 }
8
9 }

?

轉載于:https://www.cnblogs.com/dummyE/archive/2011/12/28/2304622.html

總結

以上是生活随笔為你收集整理的回溯算法--8皇后问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。