public
class
recursiontest
//列印問題
public
static
void
test
(int n)
//else
}//階乘問題
public
static
intfactorial
(int n)
else
}}
迷宮問題:
//迷宮問題,求初始點到終點的一條通路(不一定是最小通路!)
//牆體設為1,路徑設為0
/* 整體思路:
1、每當我們經過乙個點,將點標記為2,代表已走過;
2、對於該點,我們依照下右上左的方向向後查詢;
3、如果該點所有路徑都走不通,就返回false,回到上乙個點處向後查詢;
4、當到達終點,即終點標記為2時,一層一層向上推出遞迴。
遞迴思路:
1、終止條件:終點處被遍歷到或者已遍歷完所有可遍歷點;
2、每層遞迴該做的事:判斷該點是否是終點,標記該點已走過,下右上左策略判斷是否可走;
3、返回引數:返回該點四個方向是否有可到終點的通路。
*/public
class
migong
system.out.
println()
;}}private
static
boolean
findway
(int
map,
int i,
int j)
if(map[i]
[j]==0)
else
if(j +
1< map[0]
.length &&
findway
(map, i, j +1)
)else
if(i -
1>=0&&
findway
(map, i -
1, j)
)else
if(j -
1>=0&&
findway
(map, i, j -1)
)else
}else
}}
八皇后問題
二維陣列解法:
/*
1、遞迴結束條件:當遍歷完所有(即遍歷完從第一行第八列開始的所有可能)自動結束
2、每層遞迴流程:首先判斷這一行是否為第八行,如果是,直接輸出並返回,如果不是,在這一行尋找可以放置皇后的位置
*/public
class
eightempress
private
static
void
findway
(int
board,
int num)
system.out.
println()
;}return;}
else}}
}//判斷是否可以放置棋子
private
static
boolean
placeable
(int
board,
int x,
int y)
/* 斜向是否存在棋子
斜向表示:要麼與該點和相等(左上->右下),要麼與該點差相等(右上->左下)
即:i+j==x+y||i-j==x-y j=x+y-i||j=y-x+i
*/if(
(x+y-i>=
0&&x+y-i<
8&&board[i]
[x+y-i]==1
)||(y-x+i>=
0&&y-x+i<
8&&board[i]
[y-x+i]==1
))}return
true;}
}
一維陣列解法:
//用一維陣列解決八皇后問題
/* 思路分析:用陣列小標來表示行號,用陣列的值表示列數
*/public
class
eightempress2
private
static
void
findway
(int
col,
int row)
else}}
}//判斷是否可以放置
private
static
boolean
check
(int
col,
int row,
int column)
}return
true;}
//輸出
private
static
void
print
(int
col)
else
} system.out.
println()
;}}}
經典遞迴問題 八皇后
八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。解題思路 在這之前我們要明確遞迴求解其實是分成兩個部分的 遞迴回朔...
經典 八皇后 遞迴
八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法.由於使用迴圈會存在多層,比較繁雜,這裡使用遞迴dfs 深度優先搜尋...
遞迴演算法解決八皇后問題
在 8 8 格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。高斯認為有 76 種方案。1854 年在柏林的象棋雜誌上不同的作者發表了 40 種不同的解,後來有人用圖論的方法解出 92 種結果。這個問題也一共有92種解法 思路分析 第乙個...