/**
*
@author
phinecos
*
@since
2008/10/31
*/
class
EightQueen
{
static
final
int
MAXSIZE
=
8
;
//
棋盘大小
static
int
okTimes
=
0
;
//
解法个数
static
int
[][] chess
=
new
int
[MAXSIZE][MAXSIZE];
//
棋盘
public
static
boolean
CanPut(
int
row,
int
col)
{
//
皇后能否放置在chess[row][col]的位置上
//
第row行不能有多于1个皇后
int
i,j;
for
(i
=
0
;i
<
MAXSIZE;
++
i)
{
if
(chess[row][i]
==
1
)
return
false
;
}
//
第col列不能有多于1个皇后
for
(i
=
0
;i
<
MAXSIZE;
++
i)
{
if
(chess[i][col]
==
1
)
return
false
;
}
//
对角线不能有多于1个皇后
//
反对角线
for
(i
=
row
-
1
,j
=
col
+
1
;i
>=
0
&&
j
<
MAXSIZE;
--
i,
++
j)
{
if
(chess[i][j]
==
1
)
return
false
;
}
for
(i
=
row
+
1
,j
=
col
-
1
;i
<
MAXSIZE
&&
j
>=
0
;
++
i,
--
j)
{
if
(chess[i][j]
==
1
)
return
false
;
}
//
对角线
for
(i
=
row
-
1
,j
=
col
-
1
;i
>=
0
&&
j
>=
0
;
--
i,
--
j)
{
if
(chess[i][j]
==
1
)
return
false
;
}
for
(i
=
row
+
1
,j
=
col
+
1
;i
<
MAXSIZE
&&
j
<
MAXSIZE;
++
i,
++
j)
{
if
(chess[i][j]
==
1
)
return
false
;
}
return
true
;
}
public
static
void
Solve(
int
curChess,
int
num)
{
if
(num
==
8
)
{
//
八个皇后了,
okTimes
++
;
return
;
}
else
{
if
(curChess
<
64
)
{
int
i,j;
i
=
curChess
/
MAXSIZE;
//
行
j
=
curChess
%
MAXSIZE;
//
列
if
(chess[i][j]
==
0
&&
CanPut(i,j)
==
true
)
{
//
chesss[i][j]空着,并且经测试可以放置
chess[i][j]
=
1
;
//
放置皇后下去
Solve(curChess
+
1
,num
+
1
);
chess[i][j]
=
0
;
//
回溯
}
Solve(curChess
+
1
,num);
//
chess[i][j]无法放置,跳过它
}
}
}
public
static
void
main(String args[])
{
int
i,j;
for
(i
=
0
;i
<
MAXSIZE;
++
i)
for
(j
=
0
;j
<
MAXSIZE;
++
j)
{
chess[i][j]
=
0
;
}
Solve(
0
,
0
);
System.out.println(
"
八皇后问题共有
"
+
okTimes
+
"
个解法
"
);
}
}