/*
* 8情人問題
*
* 問題描述
* 在一個8×8的棋盤裡放置8個情人
*(在每一橫列
*
* 數據表示
* 用一個
* 比如
* 第
* 第
* 第
*
* 第
*
* 循環變量從
* 程序中用八進制數用一個一維數組 data[] 表示
*
* 檢測沖突
* 橫列沖突
* 斜列沖突
*
* 好處
* 采用循環
* 可計算 n 情人問題
* 把問題線性化處理
*
* ToDo
* 枚舉部分還可以進行優化
* 輸出部分可以修改成棋盤形式的輸出
*
* @author cinc
*
*/
public class Queen {
int size;
int resultCount;
public void compute ( int size ) {
this
resultCount =
int data[] = new int[size];
int count; // 所有可能的情況個數
int i
// 計算所有可能的情況的個數
count =
for ( i=
count = count * size;
}
// 對每一個可能的情況
for ( i=
// 計算這種情況下的棋盤上情人的擺放位置
// 此處可優化
int temp = i;
for ( j=
data [j] = temp % size;
temp = temp / size;
}
// 測試這種情況是否可行
if ( test(data) )
output( data );
}
}
/*
* 測試這種情況情人的排列是否可行
*
*/
public boolean test( int[] data ) {
int i
for ( i=
for ( j=i+
// 測試是否在同一排
if ( data[i] == data[j])
return false;
// 測試是否在一斜線
if ( (data[i]+i) == (data[j]+j) )
return false;
// 測試是否在一反斜線
if ( (data[i]
return false;
}
}
return true;
}
/*
* 輸出某種情況下情人的坐標
*
*/
public void output ( int[] data ){
int i;
System
for ( i=
System
}
System
}
//main()就是在這裡
public static void main(String args[]) {
(new Queen()pute(
}
}
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19303.html