N-皇后问题

n-皇后问题是4 -皇后问题的推广。n个皇后将被放置在n×n的棋盘上且使得没有两个皇后可以互相攻击。解空间由n-元组(1,2,…,n)的n!个排列所组成。 n=1,解为1,n=2,3,无解。下图给出了当n=4时的树结构。像这样的一棵树称为排列树。树的边由xi的可能的取值标记。由i级到i+1级节点的边给出xi的值。解空间由从根节点到叶节点的所有路径定义。

以四皇后为例:

代码实现:

import java.util.Scanner;

public class queue {
    static int n;
    int[] a=new int [21];
    void print(){       //打印棋子
        int i;
        for( i=1;i<=n;i++){
            System.out.print(a[i]+" ");
        }
        System.out.println();
        if(i%7==0){
          System.out.println();
        }
    } 
    void printgraph()    //图形化打印布局
    {
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++)
            if(a[i]==j)
                System.out.print("*"+" ");
            else
                System.out.print("0"+" ");
            System.out.println();
        }
        System.out.println();
    } 
    int Try(int x,int y){     //测试x行y列可否摆放棋子,成功返回1,否则返回0
        int j=1;
        while(j<x)         //与数组中已摆放好的数比较
        {
            if((a[j]==y)||(Math.abs(x-j)==Math.abs(a[j]-y)))
                    return 0;
            ++j;          //右移一格继续尝试
        }
        return 1;
    }
    void place(int x)     //递归函数
    {
        int y;
        if(x>n)         //棋子第n行已摆好,则打印成功方案
        {
            print();
            printgraph();       //打印图形化布局
        }
        else           
        {
            for(y=1;y<=n;++y)     //该行棋子依次从左向右移
                if(Try(x,y)==1)    //如果可以摆放
                {
                    a[x]=y;        //给a[x]赋值
                    place(x+1);    //继续下一行的递归
                }
        }
    }
    public static void main(String[] args) {
        Scanner s=new Scanner(System.in);
        n=s.nextInt();
        queue q=new queue();
        q.place(1);
    }

}
截图:

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值