[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
沉思的狗
阅读(3574)
评论(4)
编辑
收藏
评论
#
re: 刚写的八皇后问题 - 递归 (随便你定义几个皇后了)JAVA
感觉这个程序挺完美的,速度很不错的,嘿嘿。
比网上的同类程序应该快多了。
用递归+回溯法做的
#
re: 刚写的八皇后问题 - 递归 (随便你定义几个皇后了)JAVA
解释一下. 要不然看起来很难懂的.
#
re: 刚写的八皇后问题 - 递归 (随便你定义几个皇后了)JAVA
确实写得不错,LZ厉害
#
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
"
);
}
}
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
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
搜索
积分与排名
积分 - 209815
排名 - 265
最新评论
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的参数传递 (63450)
2. 本地计算机上的 MSSQLSERVER 服务启动后又停止了。一些服务自动停止,如果它们没有什么可做的,例如“性能日志和警报”服务。[用批处理解决](22454)
3. 使用Policy文件来设置Java的安全策略(10473)
4. 一个简单的十六进制计算器(出自Win程序设计)(8736)
5. VC++6.0 全部默认快捷键(6197)
评论排行榜
1. Upload Server (HTTP 上传服务JAVA程序) 速度极快(11)
2. Jni中C++和Java的参数传递 (10)
3. 垃圾软件反删除批处理文件 (7)
4. 刚写的八皇后问题 - 递归 (随便你定义几个皇后了)JAVA(4)
5. 火车运煤问题(4)
[ThinkingDog]是一个积极向上、乐观、热心的人。