算法学习 八皇后问题的递归实现 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)的地板,给定两种不同瓷砖:一种长度为 ...
随机推荐
- react-router简单使用方法
使用 传值 非Link跳转 路由返回 v2,v3里的跳转,返回和传值 问题 react-router版本 v4.x 跟着官网 https://reacttraining.com/react-route ...
- 一个异步访问redis的内存问题
| 分类 redis | 遇到一个redis实例突然内存飙高的案例, 具体症状如下: 客户端使用异步访问模式 单个请求的回包很大,hgetall一个8M的key 由于访问量比较大,已经登录不上red ...
- Mysql5.7.25安装步骤
安装步骤 在官网下载mysql-5.7.25-winx64.zip压缩包到本地,解压到非中文目录. 列如(D:\Program Files\mysql-5.7.25-winx64). 在环境变量中添加 ...
- [Statistics] Comparison of Three Correlation Coefficient: Pearson, Kendall, Spearman
There are three popular metrics to measure the correlation between two random variables: Pearson's c ...
- 前端如何真正晋级成全栈:腾讯 Serverless 前端落地与实践
Serverless 是当下炙手可热的技术,被认为是云计算发展的未来方向,拥有免运维.降低开发成本.按需自动扩展等诸多优点.尤其是在前端研发领域,使用 Node 开发云函数,可以让前端工程师更加专注于 ...
- 设计模式-12组合模式(Composite Pattern)
1.模式动机 很多时候会存在"部分-整体"的关系,例如:大学中的部门与学院.总公司中的部门与分公司.学习用品中的书与书包.在软件开发中也是这样,例如,文件系统中的文件与文件夹.窗体 ...
- 使用timeit测试Python函数的性能
timeit是Python标准库内置的小工具,可以快速测试小段代码的性能. 认识timeit timeit 函数: timeit.timeit(stmt, setup,timer, number) 参 ...
- JavaScript常见的六种继承方式
前言 面向对象编程很重要的一个方面,就是对象的继承.A 对象通过继承 B 对象,就能直接拥有 B 对象的所有属性和方法.这对于代码的复用是非常有用的. 大部分面向对象的编程语言,都是通过"类 ...
- CSS+DIV自适应布局
CSS+DIV自适应布局 1.两列布局(左右两侧,左侧固定宽度200px;右侧自适应占满) 代码如下: <!doctype html> <html> <head> ...
- Python 第一天学习记录