继往开来 吐故纳新
日历
网志分类
· 所有网志 (1031)
· 个人作品 (64)
· 软件设计 (33)
· 面向对象编程 (22)
· JavaAPI (44)
· Java开源工具 (36)
· Swing (34)
· Java语法细节 (39)
· 样式表CSS (12)
· XML (9)
· J2EE(JavaEE) (25)
· 算法数据结构 (64)
· 正则表达式 (4)
· 软件知识 (6)
· Java线程 (9)
· Web开发.Jsp/Servlet/Struts (20)
· 程序随想录 (7)
· Hibernate (7)
· Spring (5)
· J2SE 高级 (2)
· J2SE 高级 (0)
· Web开发.Ajax (15)
· Web开发.JavaScript (48)
· DB4O (2)
· Web开发.CSS/Html (22)
· C# (20)
· ERP (4)
· JDBC (1)
· 编程资源 (16)
· 编程感悟 (29)
· DB/Sql (13)
· VB (29)
· VC (2)
· 桌面脚本 (3)
· 新兴软件 (3)
· 英语学习 (21)
· 网文转载 (164)
· 职场风云 (40)
· 诗词歌赋 (32)
· 生活感言 (79)
· 生活常识 (2)
· 奇文共赏 (14)
· 财经纵横 (11)
· 未分类 (19)
站内搜索
友情链接
· 歪酷博客
· 我的歪酷 非非共享界
· 偶要雷锋
· 豆瓣
· nczonline
· 当当网
· easyjf中文站
· Donews
· 天极Java文章列表
· W3CSchool
· taiten的BLOG
· Dojo中国
· Dojo
· Extjs.com
· Lifehack中文网志
· JaveEye的一个AS专题
· Banq's JDon
· Java 中文网址大全
· 梦想Java
· 360Doc个人图书馆
· java开源大全
· 我在硅谷动力的软件下载站
· 站长中国
· 随意贴
· CSS教学素材站
· java 参考中文站
· 面向构件与SOA社区
· 彩字生成
· 派派小说论坛
· 如坐春风
· 英语学习网
· BBC CHina
· www.dlbang.com
· 古文竖排格式在线转化工具
· 免费家谱
· 图片上传基地
· 风景壁纸
· 和风细雨
· MyC#BlogInCsdn

订阅 RSS

0391853

歪酷博客

开此博一为经验积累,二为资料收集,三为同道交流,四为资源共享.
« 上一篇: 【转载】世界工厂大规模倒闭,中央政策紧急刹车 下一篇: 【转载】Linux学习系列之J2EE(JAVA EE)配置指南 »
Junglesong @ 2008-07-08 12:17

回溯法有“通用的解题法“之称。用它可以系统的搜索一个问题的所有解或任一解。会所法是一个既带有系统性又带有跳跃性的搜索算法,他在包含问题的所有解的解空间树中,按照深度有限的策略,从根节点出发搜索解空间树,算法搜索至解空间树的任一节点时,总是先判断该节点是否肯定不包含问题的解。如果肯定不包含,则跳过对该节点为根的子树的系统搜索,逐层向其祖先节点回溯,否则进入该子树,继续按照深度优先的策略进行搜索。回溯法在用来求问题的任一接时,只要搜索到问题的一个解就可以结束。
这种深度优先的解的算法称为回溯法,它适合于解一些组合数较大的问题。

用回溯法解n皇后问题时,可以用一棵完全n叉树来表示其解空间。剪去不满足行列和斜线攻击的子树后,剩下的就是问题的解答。

代码:

package com.sitinspring;

/**
 * 八皇后问题回溯版
 * 
@author sitinspring(junglesong@gmail.com)
 * 
@since 2008-7-8 上午10:34:28
 * @vsersion 1.00 创建 sitinspring 2008-7-8 上午10:34:28
 
*/

public class EightQueenBacktrack{
    
// 皇后数量
    private int queenCount;
    
    
// 存放皇后纵坐标的数组
    private int[] arr;
    
    
/**
     * 构造函数
     * 
@param queenCount
     
*/

    
public EightQueenBacktrack(int queenCount){
        
this.queenCount=queenCount;
        arr
=new int[queenCount];
        
        
// 从第零个皇后开始放置
        backtrack(0);
    }

    
    
/**
     * 显示n皇后在棋盘中位置
     *
     
*/

    
private void displayArr(){
        System.out.println(
"-------"+queenCount+"------>");
        
for(int i=0;i<queenCount;i++){
            
for(int j=0;j<queenCount;j++){
                
if(arr[i]!=j){
                    System.out.print(
"■ ");
                }

                
else{
                    System.out.print(
"");
                }

            }

            
            System.out.println();
        }

        System.out.println(
"<-------"+queenCount+"------");
    }

    
    
/**
     * 判断处于第n位的皇后是否与前面的皇后冲突
     * 
@param n
     * 
@return
     
*/

    
private boolean isValidPos(int n){
        
for(int i=0;i<n;i++){
            
// 斜线鉴别和列鉴别。行鉴别无须参与
            if(Math.abs(n-i)==Math.abs(arr[n]-arr[i]) || arr[i]==arr[n]){
                
return false;
            }

        }

        
        
return true;
    }

    
    
/**
     * 回溯依次安放皇后的位置
     * 
@param column
     
*/

    
private void backtrack(int column){
        
if(column==queenCount){    
            
// 进入这里表示前面的queenCount个皇后都已经放在了正确的位置
            displayArr();    // 显示皇后    
            return;
        }

        
else{
            
for(int i=0;i<queenCount;i++){
                
// 皇后共有queenCount个位置可选
                arr[column]=i;
                
if(isValidPos(column)){
                    
// 安放下一个皇后
                    backtrack(column+1);
                }

            }

        }

    }

    
    
/**
     * 程序入口
     * 
@param args
     
*/

    
public static void main(String[] args){
        
new EightQueenBacktrack(8);
        
        
/*for(int i=1;i<20;i++){
            new EightQueenBacktrack(i);
        }
*/

    }

}


输出:
-------8------>
Q ■ ■ ■ ■ ■ ■ ■ 
■ ■ ■ ■ Q ■ ■ ■ 
■ ■ ■ ■ ■ ■ ■ Q 
■ ■ ■ ■ ■ Q ■ ■ 
■ ■ Q ■ ■ ■ ■ ■ 
■ ■ ■ ■ ■ ■ Q ■ 
■ Q ■ ■ ■ ■ ■ ■ 
■ ■ ■ Q ■ ■ ■ ■ 
<-------8------
-------8------>
Q ■ ■ ■ ■ ■ ■ ■ 
■ ■ ■ ■ ■ Q ■ ■ 
■ ■ ■ ■ ■ ■ ■ Q 
■ ■ Q ■ ■ ■ ■ ■ 
■ ■ ■ ■ ■ ■ Q ■ 
■ ■ ■ Q ■ ■ ■ ■ 
■ Q ■ ■ ■ ■ ■ ■ 
■ ■ ■ ■ Q ■ ■ ■ 
<-------8------
-------8------>
Q ■ ■ ■ ■ ■ ■ ■ 
■ ■ ■ ■ ■ ■ Q ■ 
■ ■ ■ Q ■ ■ ■ ■ 
■ ■ ■ ■ ■ 



评论 / 个人网页 / 扔小纸条
*昵称

已经注册过? 请登录

Email
网址
*评论