【数据结构与算法】回溯法解决N皇后问题,java代码实现

本文介绍了N皇后问题,即在N×N棋盘上放置皇后,使其互不攻击。文章阐述了问题描述、核心思想,并提供了一个用Java实现的完整回溯法代码示例,特别强调了在实现过程中`offer`方法相对于`add`方法的优势。
摘要由CSDN通过智能技术生成

N皇后问题

问题描述

在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法,这称为八皇后问题。
延伸一下,便为N皇后问题。

核心思想

解决N皇后问题有两个关键点。一是如何进行放置棋子,二是如何验证棋子是否符合要求。

因此,我们利用回溯法建立函数。

 private static void NQueen(LinkedList<Location> list, int x, int y) {
      

        if(list.size() == SIZE){
     //当list元素个数为SIZE时,表示SIZE个皇后都摆放完毕,打印后即可退出函数。
            printLocation(list);  //打印皇后摆放方式
            return ;
        }

        for(int i = x ; i < SIZE ; i++){
   
            Location loc = new Location(i, y);
            if(isLegalLoc(list, loc)){
   
                list.offer(loc);  //将第y列的皇后摆放好
                NQueen(list, 0, y+1);  //开始摆放y+1列的皇后,同样从第0列开始摆放
                list.pollLast();  //每次摆放完一个皇后后,都要将其撤回,再试探其它的摆法。
            }                   
        }           
    }

	
	/**
     * 判断位置为loc的皇后是否合法
     */
    private static boolean isLegalLoc(LinkedList<Location> list, Location loc) {
   
        for(Location each : list){
   
            if(loc.x == each.x 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值