博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
八皇后问题(递归版)
阅读量:7088 次
发布时间:2019-06-28

本文共 1679 字,大约阅读时间需要 5 分钟。

/**
 * 
@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
+
"
个解法
"
); 
    }
本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2008/10/31/1323800.html,如需转载请自行联系原作者
你可能感兴趣的文章
创建逻辑卷 安装lvm命令
查看>>
不使用root身份运行Wireshark
查看>>
PageRank算法计算网页的价值
查看>>
js面向对象
查看>>
DEDECMS 修改广告链接地址
查看>>
抓住“扁平化”
查看>>
Python中method的参数传递详解
查看>>
Skia深入分析1——skia上下文
查看>>
Tiny Jpeg Decoder (JPEG解码程序) 源代码分析 1:解码文件头
查看>>
windows Server2008 下部署nginx
查看>>
MySQL 性能监控4大指标——第一部分
查看>>
御安全浅析安卓开发代码混淆技术
查看>>
面向对象三大特征
查看>>
我的友情链接
查看>>
Nginx 负载均衡(简单配置)
查看>>
Linux之使用haproxy搭建web群集(2)
查看>>
在Linux启动时自动加载内核模块
查看>>
tomcat部署web程序,jkd环境变量设置,
查看>>
GitLab安装篇-Ubuntu 14.04 LTS
查看>>
我的友情链接
查看>>