遞迴 迷宮問題和八皇后問題

2021-10-24 18:38:25 字數 4010 閱讀 8570

map[i][j]: 0表示未走過, 可以嘗試; 1表示牆; 2表示該路, 可以走通; 3表示該路, 已走過, 但走不通

當 map[6][5] == 2, 則已到達目的地(最右下角), 結束遞迴

public static void main(string args)

/** 第1列和7行, 使用1填牆*/

for (int h = 1; h < horizontalnum - 1; h++)

/** 內部設定擋板*/

map[3][1] = 1;

map[3][2] = 1;

// map[1][2] = 1;

// map[2][2] = 1;

/** 列印地圖*/

system.out.println("地圖:");

for (int h = 0; h < horizontalnum; h++)

system.out.println();

}/** 策略1: 從第2行&第2列開始起步*/

setstrategy1(map, 1, 1);

/** 策略2*/

//setstrategy2(map, 1, 1);

system.out.println("走過的路線:");

for (int h = 0; h < horizontalnum; h++)

system.out.println();}}

/** 嘗試方向策略: 下->右->上->左*/

public static boolean setstrategy1(int map, int h, int v) else else if (setstrategy1(map, h, v + 1)) else if (setstrategy1(map, h - 1, v)) else if (setstrategy1(map, h, v - 1)) else

} else }}

/** 嘗試方向策略: 上->右->下->左*/

public static boolean setstrategy2(int map, int h, int v) else else if (setstrategy2(map, h, v + 1)) else if (setstrategy2(map, h + 1, v)) else if (setstrategy2(map, h, v - 1)) else

} else }}

}> 地圖:

> 1 1 1 1 1 1 1

> 1 0 0 0 0 0 1

> 1 0 0 0 0 0 1

> 1 1 1 0 0 0 1

> 1 0 0 0 0 0 1

> 1 0 0 0 0 0 1

> 1 0 0 0 0 0 1

> 1 1 1 1 1 1 1

> 走過的路線(策略1):

> 1 1 1 1 1 1 1

> 1 2 0 0 0 0 1

> 1 2 2 2 0 0 1

> 1 1 1 2 0 0 1

> 1 0 0 2 0 0 1

> 1 0 0 2 0 0 1

> 1 0 0 2 2 2 1

> 1 1 1 1 1 1 1

> 走過的路線(策略2):

> 1 1 1 1 1 1 1

> 1 2 2 2 2 2 1

> 1 0 0 0 0 2 1

> 1 1 1 0 0 2 1

> 1 0 0 0 0 2 1

> 1 0 0 0 0 2 1

> 1 0 0 0 0 2 1

> 1 1 1 1 1 1 1

# 當內部設定擋板

map[3][1] = 1;

map[3][2] = 1;

map[1][2] = 1;

map[2][2] = 1;

## 執行過程(回溯):

* 1. (1, 1)

* 2. (2, 1) return true;

1 1 1 1 1 1 1

1 2 1 0 0 0 1

1 2 1 0 0 0 1

1 1 1 0 0 0 1

1 0 0 0 0 0 1

1 0 0 0 0 0 1

1 0 0 0 0 0 1

1 1 1 1 1 1 1

* 3. (3, 1) return false; map[3][1] != 0

* 4. (2, 2) return false; map[2][2] != 0

* 5. (1, 1) return false; map[1][1] != 0

* 6. (2, 0) return false; map[2][0] = 3

1 1 1 1 1 1 1

1 2 1 0 0 0 1

1 3 1 0 0 0 1

1 1 1 0 0 0 1

1 0 0 0 0 0 1

1 0 0 0 0 0 1

1 0 0 0 0 0 1

1 1 1 1 1 1 1

* 7. (1, 2) return false; map[1][2] != 0

* 8. (0, 1) return false; map[0][1] != 0

* 9. (1, 0) return false; map[1][0] = 3

* 最後輸出:

1 1 1 1 1 1 1

1 3 1 0 0 0 1

1 3 1 0 0 0 1

1 1 1 0 0 0 1

1 0 0 0 0 0 1

1 0 0 0 0 0 1

1 0 0 0 0 0 1

1 1 1 1 1 1 1

/** 定義皇后數*/

static int max = 8;

static int queens = new int[max];

/** 解決方式的總數*/

static int count = 0;

/** 判斷衝突的總數*/

static int conflictedcount = 0;

public static void main(string args)

/*** 1) num是第 num個皇后(第幾行的皇后)

* 2) 經過 for(int pos = 0; pos < max; pos++)依次放好8皇后

* 3) 迴圈遞迴呼叫 setposition(num + 1), 直到8位皇后放好完成了乙個解決方式後列印

* */

private static void setposition(int num)

/** 迴圈依次放好8皇后*/

for(int pos = 0; pos < max; pos++)

/** 如果衝突, 就會將第 num的皇后, 向右移一位 array[num] = pos, 再繼續判斷*/}}

/** 判斷規則: 棋盤上放置8個棋子(皇后), 且相互不衝突(皇后在同一行, 同一列和同一斜線上都屬衝突)*/

private static boolean judge(int num)

}return true;

}/** 列印解決方式(每次列印一種)*/

private static void print()

system.out.println("第 " + count + "次");

}}輸出:

> 0 4 7 5 2 6 1 3 第 1次

> 0 5 7 2 6 3 1 4 第 2次

> 0 6 3 5 7 1 4 2 第 3次

> 0 6 4 7 1 3 5 2 第 4次

> 1 3 5 7 2 0 6 4 第 5次

> 1 4 6 0 2 7 5 3 第 6次

> 1 4 6 3 0 7 5 2 第 7次

......

> 解決方式的總數為 92

> 判斷衝突的總數為 15720

如果您覺得有幫助,歡迎點讚哦 ~ 謝謝!!

遞迴的應用 迷宮問題和八皇后問題

右下角位置為出路 小球走過,並標識過的 地圖的情況 for int i 0 i 8 i system.out.println 1.map 表示地圖 2.i,j 表示當前位置座標 3.如果小球能到 map 6 5 位置,則說明通路找到.4.約定 當map i j 為 0 表示該點沒有走過 當為 1 表...

遞迴回顧(迷宮問題,八皇后問題)

簡單的說 遞迴就是方法自己呼叫自己,每次呼叫時傳入不同的變數,遞迴有助於程式設計者解決複雜的問題,同時讓 變得簡潔。遞迴呼叫規則 1.當程式執行到乙個方法的時候,就會開闢乙個獨立的空間棧 2.每個空間的資料 區域性變數 是獨立的 列印問題 8public static void test int n...

八皇后問題 遞迴

問題描述 在乙個8 8西洋棋盤上,有8個皇后,每個皇后佔一格 要求皇后間不會出現相互 攻擊 的現象,即不能有兩個皇后處在同一行 同一列或同一對角線上。問共有多少種不同的方法。程式 public void testeightprince 初始化,所有的位置都可以放置乙個皇后 for int x 0 x...