回溯法求解 “n 皇后 问题”——Java 实现

 n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n×n格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。

回溯算法描述:

void Queue(int n)

   {

       for (i=1; i<=n; i++)    //初始化

          x[i]=0;

       k=1;

       while (k>=1)

       {

            x[k]=x[k]+1;     //在下一列放置第k个皇后

            while (x[k]<=n && !Place(k))

            x[k]=x[k]+1;     //搜索下一列

            if (x[k]<=n && k= =n) {   //得到一个解,输出

                 for (i=1; i<=n; i++) 

                     cout<<x[i];

                 return; }

 

else if (x[k]<=n && k<n)

                        k=k+1;      //放置下一个皇后

                  else {     

                      x[k]=0;     //重置x[k],回溯

                      k=k-1;

                  }  }

     }

    

     bool Place(int k)   //考察皇后k放置在x[k]列是否发生冲突

    {

         for (i=1; i<k; i++)  

             if (x[k]= =x[i] | | abs(k-i)= =abs(x[k]-x[i]))

                 return false;

             return true; }

NQueen.java                   //回溯算法

import java.util.*;

public class NQueen
{
 public static void main(String[] args)
 {
  Scanner in=new Scanner(System.in);
  System.out.println("Please enter the number of queen you want(请输入你要求解的皇后的个数)");
  int n=in.nextInt();
  double startTime=System.currentTimeMillis();//startTime
  Queen(n);
  double endTime=System.currentTimeMillis();//endTime
  System.out.println("Basic Statements take(基本语句用时) "+(endTime-startTime)+" milliseconds!");
 }
 /**
  *用回溯法设计函数Queen(n)求解
  */
 public static boolean Place(int x[],int k)//考察皇后k放置在x[k]列是否发生冲突
 {
  for(int i=1; i<k; i++)  
   if (x[k]==x[i]||Math.abs(k-i)==Math.abs(x[k]-x[i]))
    return false;
   return true;
 }
 public static void Queen(int n)
 {
  int x[]=new int[n+1];
  for (int i=1; i<=n; i++)//初始化
   x[i]=0;
  int k=1;
  while (k>=1)
  {
   x[k]=x[k]+1;//在下一列放置第k个皇后
   while (x[k]<=n&&!Place(x,k))
    x[k]=x[k]+1;//搜索下一列
   if (x[k]<=n && k==n)
   {   //得到一个解,输出
       System.out.println("The answer is(得到的解是):");
    for (int i=1; i<=n; i++) 
    System.out.print("("+i+","+x[i]+")"+" ");
    System.out.println();
    return;
   }
   else if (x[k]<=n && k<n)
    k=k+1;//放置下一个皇后
   else
   {     
    x[k]=0;//重置x[k],回溯
    k=k-1;
   }
  }
   }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值