算法学习 八皇后问题的递归实现 java版 回溯思想
1.问题描述
八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。当且仅当 n = 1 或 n ≥ 4 时问题有解。
2.思路分析
回溯法:当把问题分成若干步骤并递归求解时,如果当前步骤没有合法的选择时,则函数即调用上一层的递归,此即为回溯。
在每次的正向递归时是一个试探的过程,将本次的影响带入到下一次的递归过程中去,如果在下一次的函数中,并没有找到一个合适的解去调用在下一层的函数,则证明上一次的函数过程产生了不正确的中间结果,这个结果使得整个函数不能被正确执行了,所以此时应返回对于全局变量的影响(如果产生了如果有必要,回溯法的过程中大多数是有必要返回这个影响的),然后再次去试探。。。一直到达递归的出口。
八皇后问题的思路即:
1):以行的方式去摆放棋子
2):在每次的试探摆放时,检查是否有以前的棋子与本次拟摆放的位置相冲突,(由于是按行摆放,故只需验证是否有同一列和同一对角线即可)
3): 如果产生了冲突,则返回上一层的调用
4):如果产生了符合条件的位置,则进入下一行的判断
package lianxi;
import java.util.Scanner;
public class EightQueen {
		static int tol = 0,n;
		static int C[] ;
		static Scanner scan = new Scanner(System.in);
	public static void main(String[] args) {
			 n = scan.nextInt();
			C = new int[n];
			for(int j=0;j<n;j++){
				C[j] = 0;
			}
		 search(0);
		System.out.println(tol);
	}
	private static void search(int cur) {
			if(cur == n){
				tol++;
				System.out.println("第"+tol+"种放法:");
			for(int i = 0;i< n;i++){
				for(int i1 = 0;i1< n;i1++){
					if(C[i] == i1)
						System.out.print('Q');
					else
						System.out.print('+');
				}
				System.out.println();
			}
			System.out.println();
			}else {
				for(int j = 0;j<n;j++){
					int ok = 1;
					C[cur] = j;
					for(int k = 0;k<cur ;k++){
						if(C[k] == C[cur] || C[k] - k ==C[cur]-cur || C[cur] + cur == C[k] + k ){//C[k] - k ==C[cur]-cur   C[cur] + cur == C[k] + k分别用于判断是否有与当前位置处于右下对角线和左下对角线的皇后
						ok = 0;
						break;
						}
					}
					if(ok==1)search(cur+1);
				}
			}
	}
}
算法学习 八皇后问题的递归实现 java版 回溯思想的更多相关文章
- 【算法】八皇后问题 Python实现
		[八皇后问题] 问题: 国际象棋棋盘是8 * 8的方格,每个方格里放一个棋子.皇后这种棋子可以攻击同一行或者同一列或者斜线(左上左下右上右下四个方向)上的棋子.在一个棋盘上如果要放八个皇后,使得她们互 ... 
- C#中八皇后问题的递归解法——N皇后
		百度测试部2015年10月份的面试题之——八皇后. 八皇后问题的介绍在此.以下是用递归思想实现八皇后-N皇后. 代码如下: using System;using System.Collections. ... 
- 一道算法题-八皇后问题(C++实现)
		八皇后问题 一.题意解析 国际象棋中的皇后,可以横向.纵向.斜向移动.如何在一个8X8的棋盘上放置8个皇后,使得任意两个皇后都不在同一条横线.竖线.斜线方向上?八皇后问题是一个古老的问题,于1848年 ... 
- Java实现蓝桥杯 算法提高 八皇后 改
		**算法提高 8皇后·改** 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大. 输入格式 一个8*8的棋 ... 
- python学习八皇后问题
		0 # -*- coding: utf-8 -*- 1 import random #冲突检查,在定义state时,采用state来标志每个皇后的位置,其中索引用来表示横坐标,基对应的值表示纵坐标,例 ... 
- 八皇后问题 dfs/递归
		#include <bits/stdc++.h> using namespace std; const int maxn = 55; int ans=0; int vis_Q[maxn]; ... 
- C++基础算法学习——N皇后问题
		n皇后问题:输入整数n, 要求n个国际象棋的皇后,摆在n*n的棋盘上,互相不能攻击,输出全部方案. 代码如下: #include <iostream> #include<cmath& ... 
- C语言:试探算法解决“八皇后”问题
		#include <stdio.h> #define N 4 int solution[N], j, k, count, sols; int place(int row, int col) ... 
- 算法训练 瓷砖铺放   【递归】java
		算法训练 瓷砖铺放 时间限制:1.0s 内存限制:512.0MB 锦囊1 锦囊2 锦囊3 问题描述 有一长度为N(1<=N<=10)的地板,给定两种不同瓷砖:一种长度为 ... 
随机推荐
- 关于vue+element-ui项目的分页,返回默认显示第一页的问题解决
			关于vue+element-ui项目的分页,返回默认显示第一页的问题解决 问题描述 当前页面如下: 然后点击页码跳到第3页,然后在第三页点击页面链接跳转到新的页面 然后在新页面点击返回按钮,返 ... 
- 最强加密算法?AES加解密算法Matlab和Verilog实现
			目录 背景 AES加密的几种模式 基本运算 AES加密原理 Matlab实现 Verilog实现 Testbench 此本文首发于公众号[两猿社],重点讲述了AES加密算法的加密模式和原理,用MATL ... 
- 国际控制报文协议ICMP
			国际控制报文协议ICMP ICMP简介 ICMP 用于主机或路由器报告差错情况和提供有关异常情况的报告(检测网络错误). ICMP 不是高层协议,而是 IP 层的协议. ICMP 报文的格式 ICMP ... 
- JavaScript 预解析机制
			首先我们来看一段代码: <script> console.log(a); var a = 10; </script> 此时运行结果为 为什么会显示undefined呢?这就 ... 
- scrapy爬虫-scrapy-redis分布式
			1.如何将一个scrapy爬虫项目修改成为一个简单的分布式爬虫项目 官方文档:https://scrapy-redis.readthedocs.io/en/stable/ 只用修改scrapy项目的两 ... 
- R语言入门级实例——用igragh包分析社群
			R语言入门级实例——用igragh包分析社群 引入—— 本文的主要目的是初步实现R的igraph包的基础功能,包括绘制关系网络图(social relationship).利用算法进行社群发现(com ... 
- SpringBoot2整合Redis缓存
			遵循SpringBoot三板斧 第一步加依赖 <!-- Redis --> <dependency> <groupId>org.springframework.bo ... 
- python fake_useragent模块 user-agent的获取
			1. UserAgent 模块使用 from fake_useragent import UserAgent ua = UserAgent() # 实例化,实例化时需要联网但是网站不太稳定 print ... 
- LeetCode 题解 |  面试题 10.01. 合并排序的数组
			给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B. 编写一个方法,将 B 合并入 A 并排序. 初始化 A 和 B 的元素数量分别为 m 和 n. 示例: 输入: A = [ ... 
- [翻译]python3中新的字符串格式化方法-----f-string
			从python3.6开始,引入了新的字符串格式化方式,f-字符串. 这使得格式化字符串变得可读性更高,更简洁,更不容易出现错误而且速度也更快. 在本文后面,会详细介绍f-字符串的用法. 在此之前,让我 ... 
