亚子哥刷题之路-N皇后问题

本文介绍了N皇后问题,即在N*N棋盘上摆放N个皇后,要求彼此不同行、不同列、不同斜线。文章详细阐述了解题思路,包括如何确定皇后不能放置的位置,并提出了逐行放置皇后的递归解决方案。
摘要由CSDN通过智能技术生成

一、问题描述

N皇后问题是指在N*N的棋盘上要摆N个皇后,要求任何两个皇后不同行、不同列,也不在同一条斜线上。给定一个整数n,返回n皇后的摆法有多少种?

举例:

n=1,返回1
n=23,无论怎么摆都不行,返回0.
n=8,返回92

二、解题思路

1、如果在(i,j)位置(第i行第j列)放置一个皇后,接下来哪些位置不能放置皇后呢?

  • 整个第i行的位置都不能放置
  • 整个第j列的位置都不能放置
  • 如果位置(a,b)满足|a-i|==|b-j|,说明(a,b)与(i,j)处在同一条斜线上,也不能放置。

2、思路

  • 把递归过程直接设计成逐行放置皇后的方式,可以避开条件1的那些不能放置的位置。
  • 用一个数组保存已经放置的皇后位置,假设数组为record,record[i]的值表示第i行皇后所在的列数。
  • 在递归计算到第i行第j列时,查看record[0…k](k<i)的值,看是否有j相等的值。若有,说明(i,j)不能放置皇后,再看是否有|k-i|==|record[k]-j|,若有,也说明(i,j)不能放置皇后。
	public int f(int n){
		/**
		 * 先决的判断
		 * --n==1时,走递归逻辑会怎样
		 */
		if(n<1){
			return 0;
		}
		int[] record=new int[n];
		return f1(0, record, n);
	}
	
	/**
	 * N皇后递归函数
	 * --递归出口
	 * --递归关系
	 */
	public int f1(int i,int[] record,int n){
		if(i==n){
			return 1;
		}
		int rs=0;
		for(int k=0;k<n;k++){
			if(f2(record, i, k)){
				record[i]=k;
				rs=rs+f1(i+1, record, n);
			}
		}
		return rs;
		
	}
	
	/**
	 * 判断在(i,j)位置放置皇后违不违法
	 * --有没有同列的?
	 * --有没有在同一斜线的?
	 */
	public boolean f2(int[] record,int i,int j){
		for(int k=0;k<i;k++){
			if(record[k]==j||Math.abs(i-k)==Math.abs(j-record[k])){
				return false;
			}
		}	
		return true;
	}


注:参考左神《程序员代码面试指南》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值