用回溯求解八个皇后问题(java)

来源:互联网 发布:淘宝好评不返现怎么办 编辑:程序博客网 时间:2024/06/15 14:43

 


 
/*
    刚看到一篇文章讲用回溯求解八个皇后问题的
  我电脑里正好也有一个,是当年刚学完数据结构里的回溯算法时编的,一起发来看看.呵呵
*/


public class EightQueens3 {

    
int n = 15;

    
int b[][];

    
int count;
    

    
public static void main(String[] args) {
        
new EightQueens3();
    }


    
public EightQueens3() {
        b 
= new int[n][n];
        getb();

    }


    
private void getb() {
        
        
boolean bool[]=new boolean[b.length];
        
for (int i = 0; i < b.length; i++){bool[i]=true;
            
for (int j = 0; j < b[0].length; j++)
                b[i][j] 
= 0;}


        count
=0;
        trial(
0, n,bool);
        
if(count==0)System.out.println("无解");
        
else System.out.println("共有"+count+"个解");
    }


    
void trial(int i, int n,boolean bool[]) {

        
if (i > n-1)
            
{display(b);count++;}
        
else {
            
for (int j = 0; j < b.length; j++{

                
if (bool[j]==true){b[i][j] = 1;bool[j]=false;
                
if (is_right(b)==true)
                
{
                    trial(i 
+ 1, n,bool);
                }
}

                b[i][j] 
= 0;
                bool[j]
=true;
            }

        }

    }


    
private boolean is_right(int[][] b) {

        
int length = b.length;
        
for(int i=0;i<length;i++)
        
{
            
int sum=0,sum2=0;
            
for(int j=0;j<length;j++)
            
{
                sum
+=b[i][j];
                sum2
+=b[j][i];
            }

            
if(sum>1||sum2>1return false;
        }

        
for (int i = 1; i < length; i++{
            
int sum = 0;
            
int sum2 = 0;
            
for (int j = 0; j <= i; j++{
                sum 
+= b[j][i - j];
                sum2 
+= b[j][j + (length - 1 - i)];
            }

            
if (sum > 1 || sum2 > 1)
                
return false;
        }

        
for (int i = length; i <= length * 2 - 3; i++{
            
int sum = 0;
            
int sum2 = 0;
            
for (int j = i - (length - 1); j < length; j++{
                sum 
+= b[j][i - j];
                sum2 
+= b[j][j - (i - (length - 1))];
            }

            
if (sum > 1 || sum2 > 1)
                
return false;
        }

        ;
        
return true;
    }


    
private void display(int[][] a) {

        
for (int i = 0; i < a.length; i++{
            
for (int j = 0; j < a[0].length; j++)
                System.out.print(a[i][j] 
+ " ");
            System.out.println();
        }

        System.out.println();
    }


}

 

原创粉丝点击