迷路と8つのクイーン問題 - アルゴリズムに2の古典的なケースをバックトラック再帰、

迷路:

問題の説明:

そのような1のような2次元配列の迷路壁を示し、0は開始と終了点を設定し、空間を表し、先頭から迷路の端部にボールを自分自身を聞かせて、パス、および2のパス識別子に着手。

コードの実装:

1  パッケージcn.ftf.digui。
2  
3  パブリック クラスMiGong {
 4      パブリック 静的 ブール findPath(INT [] [] ARR、int型 I、int型のJ){
 5          // 结束条件
6          場合(ARR [6] [5] == 2 ){
 7              戻り 8          }
 9          もし(ARR [I] [J] == 0 ){
 10の              ARR [I] [J] = 2 ;
11              場合(findPathは(ARR、I 1 + {、J))
 12                  リターン ;
13              } そう であれば(findPath(ARR、I、J + 1 )){
 14                  リターン 15              } そう であれば(findPath(ARR、I-1 、J)){
 16                  リターン 17              } そう であれば(findPath(ARR、I、J-1 )){
 18                  リターン 19              } {
 20の                  ARR [I] [J] = 3 ;
21                  リターン はfalse ;
22              }
 23         } {
 24              リターン 25          }
 26      }
 27      公共 静的 ボイドメイン(文字列[]引数){
 28          のint [] []地図= 新しい INT [8] [7 ]。
29          のためにint型 i = 0; iが7 <; Iは++ ){
 30              地図[0] [I] = 1 31              地図[7] [I] = 1 32          }
 33          のためにINT J = 0; J <7; J ++ ){
 34              地図[j] [0] = 1;
35              地図[J] [6] = 1 36          }
 37          マップ[3] [1] = 1 38          地図[3] [2] = 1 39          地図[5] [5] = 1 40          // マップ[6] [5] = 1。
41          のSystem.out.println( "初始地图:" )。
42          のためには、int型、iは8 <; I = 0 iは++ ){
 43              のためのint型 J = 0; J <7; J ++ ){
 44                  System.out.print(マップ[I] [J] +」 " )。
45              }
 46              のSystem.out.println();
47         }
 48          
49          findPath(マップ、1,1 )。
50          のSystem.out.println( "最终地图:" )。
51          のためには、int型、iは8 <; I = 0 iは++ ){
 52              のためのint型 J = 0; J <7; J ++ ){
 53                  System.out.print(マップ[I] [J] +」 " )。
54              }
 55              のSystem.out.println();
56          }
 57      }
 58 }

結果:

 

八のクイーンズ問題(Nクイーン問題)

八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n1×n1,而皇后个数也变成n2。而且仅当 n2 ≥ 1 或 n1 ≥ 4 时问题有解。

算法步骤分析:

 

 

 代码实现:

 1 package cn.ftf.queue8;
 2 
 3 public class Queue8 {
 4     private static int max=8;
 5     private static int[] arr=new int[max];
 6     private static int count=1;
 7     
 8     //每生成一种解法,将这种解法打印出来 
 9     private static void print() {
10         for(int i=0;i<max;i++) {
11             System.out.print(arr[i]+"  ");
12         }
13         System.out.println("这是第"+(count++)+"种解法!");
14     }
15     
16     //判断这个棋子是否与前面的冲突
17     private static boolean judge(int i) {
18         for(int j=0;j<i;j++) {
19             if(arr[j]==arr[i]||Math.abs(arr[j]-arr[i])==Math.abs(j-i)) {
20                 return false;
21             }
22         }
23         return true;
24     }
25     
26     //挨个的放棋子
27     private static void put(int i) {
28         if(i==max) {
29             print();
30             return;
31         }else {
32             for(int j=0;j<max;j++) {
33                 arr[i]=j;
34                 if(judge(i)) {
35                     put(i+1);
36                 }
37             }
38         }
39     }
40     
41     public static void main(String[] args) {
42         put(0);
43     }
44 }

运行结果:

共92种解法!

 

 

 

 

おすすめ

転載: www.cnblogs.com/fangtingfei/p/11524777.html