您的位置:首页 > 其它

第1次实验——NPC问题(回溯算法、聚类分析)

2014-06-12 13:31 337 查看
1)八皇后及N皇后问题

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种方法可以解决此问题。

    请编程实现八皇后问题,并把92种解的前三种解输出到屏幕(8*8的二维矩阵,Q代表皇后,X代表空)。并把此问题的求解过程延伸到N皇后问题

[java] view
plaincopy





public class Empress {  

   private int[] column;//同栏是否有皇后,1表示有  

   private int[] rup;//右上至左下是否有皇后  

    private int[] lup;//左上至右下是否有皇后  

    private int[] empress;//摆放  

    private int num;//摆放编号  

    public Empress(){  

       column= new int[8+1];  

       rup= new int[2*8+1];   

       lup = new int[2*8+1];   

       for(int i = 1; i <= 8; i++)column[i] = 1;   

       for(int i = 1; i <= 2*8; i++) rup[i] = lup[i] = 1;   

       empress = new int[8+1];       

    }  

    public void backtrack(int i) {   

       if(i > 8)  

       {  showAnswer();}  

       else   

       {   

          for(int j = 1; j <= 8; j++)  

          {   

             if(column[j] == 1 && rup[i+j] == 1 && lup[i-j+8] == 1)  


             {   

                 empress[i] = j; // 设定为占用   

                 column[j] = rup[i+j] = lup[i-j+8] = 0;   

                 backtrack(i+1);   

                 column[j] = rup[i+j] = lup[i-j+8] = 1;   

             }  

          }  

       }  

    }  

    protected void showAnswer() {   

       num++;  

       if(num>=4)  

       {  

          return;  

       }  

       else  

       {  

          System.out.println("\n摆放方式 " + num);   

          for(int y = 1; y <= 8; y++)   

          {   

             for(int x = 1; x <= 8; x++)   

             {   

                if(empress[y] == x)   

                {   

                   System.out.print(" Q");   

                   }   

                else   

                {   

                   System.out.print(" X");  

                   }   

                }   

             System.out.println();   

             }  

       }        

    }  

    public static void main(String[] args) {   

        Empress queen = new Empress();   

       queen.backtrack(1);  

    }  

}  

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: