Prime
//判斷是否為素?cái)?shù)
public boolean isPrime(long num){
for(int i=2; i<=Math.sqrt(num); i++){
if(num%i != 0)
continue;
else
return false;
}
return true;
}
Fibonacci
/**
* 斐波拉茨數(shù)列
* @param n 位置n
* @return
*/
public int fibonacci(int n){
if(n<=2){
if(n==1)
return 0;
else
return 1;
}
return fibonacci(n-1)+fibonacci(n-2);
}
Eculid
/**
* @param m 第一個(gè)整數(shù)
* @param n 第二個(gè)整數(shù)
* @return m,n的最大公因數(shù)
*/
public int gcd(int m, int n){
int temp=1;
if(m < n){
temp=n;
n=m;
m=temp;
}
while(n%m != 0){
temp=n%m;
n=m;
m=temp;
}
return temp;
}
NQueen
public class NQueen {
private int queenCount; //皇后個(gè)數(shù)
private int[] feasible; //可接受的分配方案,feasible為皇后所在行,feasible[n]為第n行皇后所在列
private int[] vol = {0, 0, 0, 0, 0, 0, 0, 0}; //保存所在列值睬魂,用于將置放皇后所在位置的值置為1
private long sum; //當(dāng)前已找到的可行方案數(shù)
private static int index; //記錄遍歷方案序數(shù)
private int[][] location;//皇后所在的位置i奕污,j第i行第j列
/**
* @param n 皇后的個(gè)數(shù)
*/
public NQueen(int n) {
sum = 0; //初始化方案數(shù)為1姐叁,當(dāng)回溯到最佳方案的時(shí)候琅豆,就自增1
queenCount = n; //求n皇后問(wèn)題奏路,由自己定義
feasible = new int[n + 1]; //x[i]表示皇后i放在棋盤的第i行的第x[i]列
index = 1; //這個(gè)是我額外定義的變量爱榕,用于遍歷方案的個(gè)數(shù)阵幸,請(qǐng)看backTrace()中h變量的作用花履,這里將它定義為static靜態(tài)變量
location = new int[n][n];
for (int i = 0; i < queenCount; i++) {
for (int j = 0; j < queenCount; j++)
location[i][j] = 0;
}
}
/**
* @param k 第k行判斷
* @return 是否可置于該位置
*/
public boolean place(int k) {
for (int j = 1; j < k; j++) {
//皇后所在的位置不可同行,同列挚赊,且斜率不為-1或1
if ((Math.abs(k - j)) == (Math.abs(feasible[j] - feasible[k])) || (feasible[j] == feasible[k])) {
return false;
}
}
return true;
}
/**
* @param t 檢測(cè)后可放置的皇后個(gè)數(shù)
*/
public void backTrace(int t) {
//t大于皇后的數(shù)目
if (t > queenCount) {
sum++; //可行方案數(shù)+1
System.out.println("可行方案" + (index++) + "↓");
output(feasible);
System.out.println("------------------------------");
}
//t小于皇后的數(shù)目
else {
//擴(kuò)展queenCount個(gè)子節(jié)點(diǎn)
for (int i = 1; i <= queenCount; i++) {
feasible[t] = i;
if (place(t)) { //檢查子結(jié)點(diǎn)的可行性
backTrace(t + 1); //遞歸調(diào)用
}
}
}
}
/**
* @param mid 中間變量
*/
public void output(int[] mid) {
for (int i = 1; i < mid.length; i++) {
vol[i - 1] = mid[i]; //可放置皇后的列值
}
//將皇后所在的位置的值為1
for (int n = 0; n < location.length; n++) {
location[n][vol[n] - 1] = 1;
}
//輸出皇后所在位置的數(shù)組诡壁,1為皇后所在的位置
for (int m = 0; m < location.length; m++) {
for (int n = 0; n < location[m].length; n++) {
if (location[m][n] == 1) {
//刪除最后一個(gè)','
if (n == location.length - 1)
System.out.print("Q");
else
System.out.print("Q,");
} else {
//刪除最后一個(gè)','
if (n == location.length - 1)
System.out.print("X");
else
System.out.print("X,");
}
}
//將皇后所在位置的置置為0,以便下一次數(shù)組安排皇后的位置
location[m][vol[m] - 1] = 0;
System.out.println();
}
}
public static void main(String[] args) {
System.out.println("------------------------------");
NQueen queen = new NQueen(7);
queen.backTrace(1); //從1開(kāi)始回溯
System.out.println("\n綜上所述荠割," + queen.queenCount + "皇后的可行方案?jìng)€(gè)數(shù)為:" + queen.sum);
}
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者