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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

八皇后java_经典八皇后问题:Java语言

發(fā)布時間:2025/3/21 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 八皇后java_经典八皇后问题:Java语言 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

問題描述:將八個皇后放在棋盤上,任何兩個皇后都不能互相攻擊(即沒有任何兩個皇后在同一行、同一列或者同一對角線上)如圖所示,題目來自于《java語言程序設計:基礎篇》練習題6.20和6.22。

在本文中,對于兩道題采用了稍微不同的解決方式,但都使用的是一維數(shù)組。6.20中,要求求出一種有效布局,我建立了一個 有八個元素的一位數(shù)組,通過隨意打亂數(shù)組的值,通過值與下標的比較,直至得出一個有效布局;6.22中,要求求出所有有效布局,這里我使用了八進制數(shù),遍歷了 ?從001234567-076543210的所有數(shù)字,通過將其轉(zhuǎn)化為八進制字符串,每位與其下標相比較,輸出滿足條件的布局。下面將對實現(xiàn)原理和方式進行詳細介紹。

Part 1 如何判斷是否是有效布局

我們將棋盤視為一個8*8矩陣,范圍均為0-7。觀察左邊的圖,可以發(fā)現(xiàn),其布局可以用一組數(shù)對來表示(從上到下),即(0, 0), (1, 6), (2, 3), (3, 5), (4, 7), (5, 1), (6, 4), (7, 2)。用一個數(shù)組來表示,即 int []list = {0, 6, 3, 5, 7, 1, 4, 2};

顯然,這是一個有效布局。下面我們就要考慮一個問題:在有效布局中,下標和其在數(shù)組中對應的值,即 i 與 list[i]?有什么關(guān)系嗎?

這里我們設 ? list[i] = k; list[j] = q; ? (i > j),它們滿足一下兩個條件(在紙上畫出來更容易明白):

1、 k != q;

2、 i - j == k - q ? ?或者 ?i - j == q -k ?(由題意得)

為了保證,k != q, 這里聲明并初始化 數(shù)組list, 使得 ? list[i] = i。 然后隨機打亂數(shù)組,然后檢查 ?是否滿足條件2

//創(chuàng)建并初始化數(shù)組

int [] list = new int[arrSize];for(int i = 0; i < arrSize; i++)

list[i]=i;//隨機打亂數(shù)組

public static void randomizeArray(int[] list){int arrSize =list.length;intranIndex;for(int i = 0; i < arrSize; i++){

ranIndex= (int)(Math.random() * arrSize);if(ranIndex !=i){int temp =list[i];

list[i]=list[ranIndex];

list[ranIndex]=temp;

}

}

}

6.20 的代碼主體 如下

//6.20 游戲:八皇后

public voidsolveEightQueens(){int arrSize = 8;int [] list = new int[arrSize];for(int i = 0; i < arrSize; i++)

list[i]=i;int count = 0;boolean notValid = true;while(notValid){

count++;

notValid= false;

randomizeArray(list);for(int i = 0; i < arrSize; i++){for(int j = i + 1; j < arrSize; j++){if(j - i == Math.abs(list[j] -list[i])){ // 檢查是否滿足條件

notValid= true;break;

}

}if(notValid) break;

}//end of outer for loop

} //end of while//print the result

inti;

System.out.println("O(∩_∩)O哈哈~, I have tried " + count + " times, and eventually succeed.");for(i = 0; i < arrSize - 1; i++){

System.out.print("(" + i + ", " + list[i] + "), ");

}

System.out.println("(" + i + ", " + list[i] + ")");

}

Part 2 求出所有的有效布局

由于6.22 要求求出所有有效的八皇后布局,隨機打亂數(shù)組的方法已經(jīng)不再適用,只好尋求一個可以遍歷所有可能的方法。一個最直接的方法是,使用八層 for循環(huán),不過代碼量太大,而且腦袋容易暈掉,所以不采用這個方法。

仔細觀察Part 1中數(shù)組的值,可以發(fā)現(xiàn),它們都在0-7之間,因此使用八進制int數(shù)進行遍歷可以保證包含每一個排列。由于八位數(shù)字各不相同,因此可能的排列有 8! = 40320種,而八進制數(shù)總共有 ?8^8 = 16777216個,因此 ?可能的比例占 ?40320/16777216 = 1/416,得到的這40320個排列還要進行檢查才能篩選出最終有效的布局。這個方法效率還是有點低,不過暫且還沒有想出更高效的。

//6.22 游戲:多種八皇后問題的解決方案(利用int值遞增,然后將其轉(zhuǎn)變?yōu)榘诉M制字符串,再進行檢查)

public static voidsolveEightQueensMethod(){int start = 001234567; //八進制

int end = 076543210; //八進制

int count = 0; // 計算有效的布局數(shù)for(int i = start; i < end; i++){boolean isValid =isValid(i);if(isValid){if(++count % 7 == 0)

System.out.println(Integer.toOctalString(i)+ ": " +isValid);else System.out.print(Integer.toOctalString(i) + ": " + isValid + " ");

}

}

System.out.println("count = " +count); // 輸出有效的布局數(shù)

}

// 檢查 number 是否是有效布局public static boolean isValid(intnumber){

String numOct=Integer.toOctalString(number);int arrSize =numOct.length();if(arrSize==7) { //如果number第一位是0,則生成的字符串只有七個字符

numOct = '0' +numOct;

arrSize++;

}for(int i = 1; i < arrSize; i ++){for(int j = i - 1; j >= 0; j--){if(numOct.charAt(i) == numOct.charAt(j)) return false; // 同一列if(i - j == Math.abs(numOct.charAt(i) - numOct.charAt(j))) return false; //同一條對角線

}

}return true;

}

Part 3 ?延伸:生成組合的問題

去年在一個筆試上,有這樣一道題。給定一個序列,輸出所有的組合。比如,

“123” 的輸出: ?1, 2, 3, 12, 13, 21, 23, 31, 32, 123, 132, 213, 231, 312, 321

“abcd”的輸出: a, b, c, d, ab, ac, ad, ba, bc, bd, ca, cb, cd, da, db, dc, abc, acb, abd, adb, acd, adc, ..., abcd, ...

在6.22中,求出所有的八皇后布局,使用的方法是是通過 遞增 int 型數(shù),再逐個進行檢查。上面的問題可以用類似的方法解決。不過效率有點低,如果有更高效的辦法,求高手指點

《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的八皇后java_经典八皇后问题:Java语言的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。