[ThinkingDog]是一個積極向上、樂觀、熱心的人。
沉思的狗の博客
[ThinkingDog]歡迎您的光臨,請多多指教!
剛寫的八皇后問題 - 遞歸 (隨便你定義幾個皇后了)JAVA
public
class
Queen_Java
{
int
QUEEN_COUNT
=
8
;
//
隨便你定義幾個皇后了,你可以循環產生a個到b個皇后的解
static
final
int
EMPTY
=
0
; //如果count[x][y] == EMPTY ,則可以放置皇后;反之,其正上方或斜上方必己放置皇后
int
[][] count
=
new
int
[QUEEN_COUNT][QUEEN_COUNT]; //
int
[] QueenIndex
=
new
int
[QUEEN_COUNT]; //第index行的皇后放置位置是QueenIndex [index]
int
resultCount
=
0
; //記錄皇后放置方法的數量
public
void
putQueenIndex(
int
index)
{
int
row
=
index;
for
(
int
col
=
0
; col
<
QUEEN_COUNT; col
++
)
{
if
(count[row][col]
==
EMPTY)
{ //該位置可以放置皇后
for
(
int
iRow
=
row
+
1
; iRow
<
QUEEN_COUNT; iRow
++
)
{ //增加該位置的正下面/斜下面的count,使之不為0
count[iRow][col]
++
;
if
((col
-
iRow
+
row)
>=
0
)
{
count[iRow][col
-
iRow
+
row]
++
;
}
if
((col
+
iRow
-
row)
<
QUEEN_COUNT)
{
count[iRow][col
+
iRow
-
row]
++
;
}
}
QueenIndex[row]
=
col;
if
(row
==
QUEEN_COUNT
-
1
)
{ //第QUEEN_COUNT個皇后己放置好,打印出這種皇后布局
print(
++
resultCount);
}
else
{ //繼續放置下一行的皇后
putQueenIndex(row
+
1
);
}
for
(
int
iRow
=
row
+
1
; iRow
<
QUEEN_COUNT; iRow
++
)
{ //回溯,在此行的皇后不放此列col ,恢復該位置的正下面/斜下面的count
count[iRow][col]
--
;
if
((col
-
iRow
+
row)
>=
0
)
{
count[iRow][col
-
iRow
+
row]
--
;
}
if
((col
+
iRow
-
row)
<
QUEEN_COUNT)
{
count[iRow][col
+
iRow
-
row]
--
;
}
}
}
}
if
(row
==
0
)
{
System.out.println(QUEEN_COUNT
+
"
皇后共有
"
+
resultCount
+
"
個解
"
);
}
}
public
void
print(
int
n)
{ //打印皇后布局
System.out.println(QUEEN_COUNT
+
"
皇后的第
"
+
n
+
"
個解:
"
);
for
(
int
i
=
0
; i
<
QUEEN_COUNT; i
++
)
{
for
(
int
j
=
0
; j
<
QUEEN_COUNT; j
++
)
{
System.out.print(QueenIndex[i]
==
j
?
"
*
"
:
"
-
"
);
}
System.out.println();
}
System.out.println();
}
public
static
void
main(String[] args)
{
new
Queen_Java().putQueenIndex(
0
);
}
}
發表于 2007-06-12 16:29
沉思的狗
閱讀(3586)
評論(4)
編輯
收藏
評論
#
re: 剛寫的八皇后問題 - 遞歸 (隨便你定義幾個皇后了)JAVA
感覺這個程序挺完美的,速度很不錯的,嘿嘿。
比網上的同類程序應該快多了。
用遞歸+回溯法做的
冰封空間
評論于 2007-06-12 17:16
回復
更多評論
#
re: 剛寫的八皇后問題 - 遞歸 (隨便你定義幾個皇后了)JAVA
解釋一下. 要不然看起來很難懂的.
啊峰
評論于 2007-06-27 08:53
回復
更多評論
#
re: 剛寫的八皇后問題 - 遞歸 (隨便你定義幾個皇后了)JAVA
確實寫得不錯,LZ厲害
fk
評論于 2008-08-28 14:04
回復
更多評論
#
re: 剛寫的八皇后問題 - 遞歸 (隨便你定義幾個皇后了)JAVA
附:現在網絡上最快的八皇后算法,己加注釋
import
java.util.Calendar;
public
class
Queen_Fastest
{
public
static
int
sum
=
0
, upperlimit
=
1
;
//
放皇后時,從右到左遞歸放(右邊是低位,左邊是高位)
/** */
/**
* 三個參數每一位代表一列,bit為1的位置不能放置皇后(與上面放置的皇后在45度角或垂直方向上有沖突)
*
@param
row 位為1的列說明上面某一行在此列己放置一個皇后
*
@param
ld 位為1的說明對應的左上角線己有皇后
*
@param
rd 位為1的說明對應的右上角線己有皇后
*/
public
static
void
compute(
int
row,
int
ld,
int
rd)
{
if
(row
!=
upperlimit)
{
int
pos
=
upperlimit
&
~
(row
|
ld
|
rd);
//
對當前行所有可以放置皇后的地方放置一個皇后,然后進入下一行
while
(pos
!=
0
)
{
int
p
=
pos
&
-
pos;
//
取得最右邊可放置皇后的位置
pos
-=
p;
//
在去掉這個位置,說明這個位置己以測試過
//
放置下一行的皇后,修改三個參數垂直與45度角上以前放置皇后點據的下一行的位置
compute(row
+
p, (ld
+
p)
<<
1
, (rd
+
p)
>>
1
);
}
}
else
//
row所有列都為1,說明己成功得到一個方案
sum
++
;
}
public
static
void
main(String[] args)
{
Calendar start;
int
n
=
8
;
if
(args.length
>
0
)
n
=
Integer.parseInt(args[
0
]);
start
=
Calendar.getInstance();
if
((n
<
1
)
||
(n
>
32
))
{
System.out.println(
"
只能計算1-32之間\n
"
);
return
;
}
System.out.println(n
+
"
皇后\n
"
);
upperlimit
=
(upperlimit
<<
n)
-
1
;
compute(
0
,
0
,
0
);
System.out.println(
"
共有
"
+
sum
+
"
種排列, 計算時間
"
+
(Calendar.getInstance().getTimeInMillis()
-
start.getTimeInMillis())
+
"
毫秒 \n
"
);
}
}
冰封空間
評論于 2009-03-05 13:03
回復
更多評論
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
<
2007年6月
>
日
一
二
三
四
五
六
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
導航
BlogJava
首頁
發新隨筆
發新文章
聯系
聚合
管理
統計
隨筆: 115
文章: 1
評論: 86
引用: 0
常用鏈接
我的隨筆
我的文章
我的評論
我的參與
最新評論
留言簿
(5)
給我留言
查看公開留言
查看私人留言
隨筆檔案
(115)
2015年1月 (1)
2011年5月 (12)
2011年4月 (2)
2010年9月 (2)
2010年8月 (4)
2009年9月 (1)
2009年6月 (1)
2009年3月 (1)
2008年6月 (1)
2008年1月 (2)
2007年7月 (2)
2007年6月 (2)
2007年5月 (4)
2007年4月 (1)
2007年1月 (1)
2006年12月 (1)
2006年11月 (2)
2006年10月 (2)
2006年9月 (3)
2006年8月 (6)
2006年7月 (1)
2006年6月 (2)
2006年5月 (10)
2006年4月 (50)
2006年3月 (1)
網址
http://blog.csdn.net/Unagain
v_JULY_v
搜索
積分與排名
積分 - 211564
排名 - 267
最新評論
1.?re: 使用Policy文件來設置Java的安全策略[未登錄]
ss
--啊啊
2.?re: Jni中C++和Java的參數傳遞
老大,Long 是J啊,不是L啊,可害苦我了,趕緊改回來吧;
--cnhua5
3.?re: Jni中C++和Java的參數傳遞
樓主,在jni里返回String和C++里獲取的為什么不一樣,比如在java里看到的值是57891234,在C++里顯示的是5789@,這是為什么啊?
--chr
4.?re: 螺旋數字與坐標
對我的項目很有幫助。
謝謝
--cs221313
5.?re: Jni中C++和Java的參數傳遞
long的符號表寫錯了,作為初學者亞歷山大啊
--hhhhhh
閱讀排行榜
1.?Jni中C++和Java的參數傳遞 (63565)
2.?本地計算機上的 MSSQLSERVER 服務啟動后又停止了。一些服務自動停止,如果它們沒有什么可做的,例如“性能日志和警報”服務。[用批處理解決](22464)
3.?使用Policy文件來設置Java的安全策略(10523)
4.?一個簡單的十六進制計算器(出自Win程序設計)(8752)
5.?VC++6.0 全部默認快捷鍵(6223)
評論排行榜
1.?Upload Server (HTTP 上傳服務JAVA程序) 速度極快(11)
2.?Jni中C++和Java的參數傳遞 (10)
3.?垃圾軟件反刪除批處理文件 (7)
4.?剛寫的八皇后問題 - 遞歸 (隨便你定義幾個皇后了)JAVA(4)
5.?火車運煤問題(4)
Powered by:
博客園
模板提供:
滬江博客
Copyright ©2025 沉思的狗
[ThinkingDog]是一個積極向上、樂觀、熱心的人。
主站蜘蛛池模板:
国产一级做a爱免费视频
|
午夜网站在线观看免费完整高清观看
|
日本一道综合久久aⅴ免费
|
亚洲成人网在线观看
|
67pao强力打造高清免费
|
久久亚洲免费视频
|
久久免费视频网站
|
亚洲激情视频在线观看
|
久久w5ww成w人免费
|
亚洲国产成人久久综合碰碰动漫3d
|
很黄很污的网站免费
|
亚洲级αV无码毛片久久精品
|
国产无遮挡又黄又爽免费网站
|
亚洲人成77777在线播放网站
|
a级毛片免费完整视频
|
亚洲av无码一区二区三区乱子伦
|
在线看片免费人成视频福利
|
亚洲av无码乱码国产精品fc2
|
四虎国产精品永久免费网址
|
亚洲乳大丰满中文字幕
|
免费人成在线观看视频高潮
|
亚洲综合精品一二三区在线
|
最刺激黄a大片免费网站
|
亚洲中文字幕久久久一区
|
国产乱色精品成人免费视频
|
一级毛片在播放免费
|
久久精品国产亚洲av麻
|
老司机在线免费视频
|
亚洲国产精品无码第一区二区三区
|
四虎永久在线精品视频免费观看
|
国产精品免费久久久久影院
|
57PAO成人国产永久免费视频
|
亚洲av午夜电影在线观看
|
国产∨亚洲V天堂无码久久久
|
99久热只有精品视频免费看
|
日韩精品免费一线在线观看
|
精品国产综合成人亚洲区
|
亚洲精品免费网站
|
一级片在线免费看
|
久久久亚洲欧洲日产国码aⅴ
|
成人爱做日本视频免费
|