`

N皇后问题

阅读更多

N皇后问题

时间限制: 5秒  内存限制: 64M

N皇后问题是一个古老而经典的题目。该问题源自数学家高斯1850年提出八皇后问题:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任 意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

例如,在一个4x4的棋盘上,摆放4个皇后有两种方法,

4queens

用文本方式输出为

* Q * *
* * * Q
Q * * *
* * Q *

* * Q *
Q * * *
* * * Q
* Q * *

我们可以用一维整数数组Q[]来表示N个皇后的摆放位置,例如,对4皇后问题的第一个解可以表示 为,Q[0]=1,Q[1]=3,Q[2]=0,Q[3]=2。

当我们逐渐往棋盘上放置皇后时,用这种表示方法,可以做如下的判断来检查新放入的皇后的位置k是否可行:

1、如果Q[i]==Q[k],则有两个皇后在同一列,不可行;

2、如果Q[i]-Q[k]==(i-k),则有两个皇后在对角线上相互攻击,不可行;

3、如果Q[k]-Q[i]==(i-k),则有两个皇后在反对角线上相互攻击,不可行;

本题要求你按顺序输出N皇后问题的解。

 

输入:

棋盘的阶数N

输出:

对应的N皇后问题的解,请按照顺序输出。顺序可参考后面给出的参考解答。

 

样例输入:

4

样例输出:

* Q * *

* * * Q

Q * * *

* * Q *

* * Q *

Q * * *

* * * Q

* Q * *

 

import java.util.Scanner;

 public class Main{     
	 public static boolean Place(int Q[],int k) //考察皇后k放置在Q[k]列是否发生冲突    
	 {     
	     for(int i=1; i<k; i++)        
	     {     
	    	 if (Q[i]==Q[k]||Q[i]-Q[k]==(i-k)||Q[k]-Q[i]==(i-k))      
	        	 return false;     
	     	 }     
	         return true;     
	     }     
	     public static void Queen(int n)     
	     {     
	    	 int Q[]=new int[n+1];     
	         for (int i=1; i<=n; i++)//初始化     
	             Q[i]=0;     
	         int k=1;     
	         while (k>=1)     
	         {     
	             Q[k]=Q[k]+1;//在下一列放置第k个皇后     
	          while (Q[k]<=n&&!Place(Q,k))      
	              Q[k]=Q[k]+1;//如果不符合条件,搜索下一列     
	          if (Q[k]<=n && k==n)     
	          {       
	              boolean[][] bl = new boolean[n][n];     
	              for (int i=1; i<=n; i++){       
	                  bl[i-1][Q[i]-1]=true;     
	              }     
	              for(int l=1;l<=n;l++){     
	                  for(int c=1;c<=n;c++){     
	                      if(bl[l-1][c-1]==true)     
	                          System.out.print("Q ");     
	                      else    
	                    	  System.out.print("* ");     
	                  }     
	                  System.out.println();     
	              }     
	           System.out.println();     
	          }      
	          else if (Q[k]<=n && k<n)     
	        	  k=k+1;     //放置下一个皇后
	          else {      
	              Q[k]=0;     //重置Q[k],回溯
	              k=k-1;     
	          }     
	         }     
	       }    
	       public static void main(String[] args)     
	       {      
	    	   Scanner scanner = new Scanner(System.in);
	    	   int n = scanner.nextInt();
	           Queen(n);     
	       }     
	   } 

 

附上论坛里最快的解法:http://www.iteye.com/topic/20059

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics