八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。
package Demo; public class 八皇后问题 { /** * @param args */ static int count=0;//记录放八皇后的方案 public static void main(String[] args) { // TODO Auto-generated method stub int[] arr=new int[8]; dfs(arr,0); System.out.println(count); } public static void dfs(int[] arr,int row){ //如果到了第九行,就跳出 if(row==8){ count++; for(int j=0;j<8;j++){ System.out.print(arr[j]+" "); } System.out.println(); return; } //row行从0列开始放置 outer:for(arr[row]=0;arr[row]<8;arr[row]++){ for(int j=0;j<row;j++){ //如果同一列、同一对角线跳出该次循环 if(arr[j]==arr[row]||arr[j]-arr[row]==j-row||arr[j]-arr[row]==row-j){ continue outer; } } dfs(arr,row+1);//放下一行 } } }