八皇后算法 回溯 递归 java

简介:   八皇后算法 回溯 递归 java                            国际象棋棋盘                               其中 一种解法     算法: 1.

 

八皇后算法 回溯 递归 java

 

 


          

            国际象棋棋盘                               其中 一种解法
 
 

 

算法:

1.判断 是否是 在米字形 上

2. 递归查找 下一个,没有,返回上一行,换一个位置继续查找(n 盘 n 皇后问题,一行有且之有一个位置)

 

 



 

 

代码

import java.util.concurrent.atomic.AtomicInteger;

public class EightQueue {
	 
	public static void main(String[] args) {
		// testCheck(); 
		for (int i = 4; i < 9; i++) {
			int rows = i; //行 一排
			int cols = i; //列
			int [][] queue = new int[rows][cols];
			AtomicInteger backtrack = backtrack(queue,0,new AtomicInteger(0));
			System.out.println(i+"阶"+backtrack.get());
		}
	} 
	
	static AtomicInteger backtrack(int [][] queue,int row,AtomicInteger ai){
		int rows = queue.length ;
		int cols = queue[0].length ;  
		
		if (row == -1) {
			return ai;
		} 
		if (row == rows) { 
			ai.getAndIncrement();
			//System.out.println("第"+ai.get()+"种解法");
			//print(queue); 
			//System.out.println();
			
			return backtrack(queue, row-1,ai);
		} 
		
		int j = 0;
	    for (int i = 0 ; i< rows; i++) {
	    	if (queue[row][i] == 1) {
				j = i+1;
				queue[row][i] = 0;
			}
		}
		boolean flag =false;
		for (; j < cols; j++) {
			if (!flag && check(row, j, queue)) {
				queue[row][j] = 1; 
				flag =true;
			}
		}
		if (!flag) { 
		   return	backtrack(queue, row-1,ai);
		}
		return backtrack(queue, row+1,ai);
	}
	
	static void print(int [][] queue){ 
		int rows = queue.length;
		int cols = queue[0].length; 
		for (int i = 0; i < rows; i++) {
			for (int j = 0; j < cols; j++) {
				System.out.print(queue[i][j]);
			}
			System.out.println();
		}
	}
	
	static void testCheck(){
		int rows = 8; //行 一排
		int cols = 8; //列
		int x= 1,y =1;
		
		for (int i = 0; i < rows; i++) {
			for (int j = 0; j < cols; j++) {
				int [][] queue = new int[rows][cols];
				queue[i][j] = 1;
				boolean check = check(x, y, queue);
				System.out.print(check +" ");
			}
			System.out.println();
		}
		
//		false false false true  true  true  true  true 
//		false false false false false false false false 
//		false false false true  true  true  true  true 
//		true  false true  false true  true  true  true 
//		true  false true  true  false true  true  true 
//		true  false true  true  true  false true  true 
//		true  false true  true  true  true  false true 
//		true  false true  true  true  true  true  false 
	}

	
	
	static boolean check(int x,int y ,int [][] queue){
		int rows = queue.length;
		int cols = queue[0].length;
		//判断四条线是否有冲突
		//1.横向是否有冲突
		for (int i = 0; i < cols; i++) {
		  if (queue[i][y] == 1) {
			return false;
		  }
		}
		//2.纵是否有冲突
		for (int i = 0; i < rows; i++) {
		  if (queue[x][i] == 1) {
			return false;
		  }
		}
		//3.米撇是否有冲突
		for (int i = 0; i < rows; i++) {
			  if ( y-i+x >= 0 && y-i+x <= rows-1  && queue[y-i+x][i] == 1) {
				return false;
			  }
		 }
		//4.米捺是否有冲突
		for (int i = 0; i < rows; i++) {
			  if ( y-x+i >= 0 && y-x+i <= rows-1 && queue[i][ y-x+i] == 1) {
				return false;
			  }
		 }
		return true;
	}
	
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

捐助开发者 

在兴趣的驱动下,写一个免费的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(支持支付宝和微信 以及扣扣群),没钱捧个人场,谢谢各位。

 

个人主页http://knight-black-bob.iteye.com/



 
 
 谢谢您的赞助,我会做的更好!

目录
相关文章
|
3月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
461 35
|
3月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
3月前
|
存储 算法 搜索推荐
《数据之美》:Java数据结构与算法精要
本系列深入探讨数据结构与算法的核心原理及Java实现,涵盖线性与非线性结构、常用算法分类、复杂度分析及集合框架应用,助你提升程序效率,掌握编程底层逻辑。
|
3月前
|
机器学习/深度学习 算法 C++
【DFS/回溯算法】2016年蓝桥杯真题之路径之谜详解
题目要求根据城堡北墙和西墙箭靶上的箭数,推断骑士从西北角到东南角的唯一路径。每步移动时向正北和正西各射一箭,同一格不重复经过。通过DFS回溯模拟“拔箭”过程,验证路径合法性。已知箭数约束路径唯一,最终按编号输出行走顺序。
|
5月前
|
算法
回溯算法的基本思想
本节介绍回溯算法,通过图1中从A到K的路径查找示例,说明其与穷举法的异同。回溯算法通过“回退”机制高效试探各种路径,适用于决策、优化和枚举问题。
160 0
|
5月前
|
运维 监控 算法
基于 Java 滑动窗口算法的局域网内部监控软件流量异常检测技术研究
本文探讨了滑动窗口算法在局域网流量监控中的应用,分析其在实时性、资源控制和多维分析等方面的优势,并提出优化策略,结合Java编程实现高效流量异常检测。
236 0
|
6月前
|
机器学习/深度学习 算法 Java
Java实现林火蔓延路径算法
记录正在进行的森林防火项目中林火蔓延功能,本篇文章可以较好的实现森林防火蔓延,但还存在很多不足,如:很多参数只能使用默认值,所以蔓延范围仅供参考。(如果底层设备获取的数据充足,那当我没说)。注:因林火蔓延涉及因素太多,如静可燃物载量、矿质阻尼系数等存在估值,所以得出的结果仅供参考。
116 5
|
6月前
|
存储 缓存 算法
什么是回溯算法
回溯算法是一种通过尝试所有可能路径寻找问题解的策略,采用深度优先搜索与状态重置机制。它适用于组合、排列、棋盘等需枚举所有可能解的问题,核心思想包括DFS遍历、剪枝优化与状态恢复。尽管时间复杂度较高,但通过合理剪枝可显著提升效率,是解决复杂搜索问题的重要方法。
309 0
|
6月前
|
存储 监控 算法
企业上网监控场景下布隆过滤器的 Java 算法构建及其性能优化研究
布隆过滤器是一种高效的数据结构,广泛应用于企业上网监控系统中,用于快速判断员工访问的网址是否为违规站点。相比传统哈希表,它具有更低的内存占用和更快的查询速度,支持实时拦截、动态更新和资源压缩,有效提升系统性能并降低成本。
222 0
|
6月前
|
存储 负载均衡 算法
我们来说一说 Java 的一致性 Hash 算法
我是小假 期待与你的下一次相遇 ~
220 1

热门文章

最新文章