【蓝桥杯】经典的八皇后问题

这个问题很经典,不清楚问题描述的可以百度一下,这里就不再赘述了,只列出我的具体做法。

import java.util.ArrayList;
import java.util.List;

class Test8Queens {

	public static StringBuffer result = new StringBuffer();

	public static List<Integer> list = new ArrayList<Integer>();

	public static int count = 0;

	public static char[][] map = new char[8][8];

	public static void main(String[] args) {
		for(int i=1; i<=8; i++) {
			list.add(i);
		}
		for(int i=0; i<map.length; i++) {
			for (int j = 0; j < map[i].length; j++) {
				map[i][j] = '*';
			}
		}
		go(0);
		System.out.println(count);
	}

	private static void go(int index) {
		if(index == 8) {
			if(check(result)) {
				count ++;
				//System.out.println(result);
				drawMap(result);
			}
			return;
		} else {
			for(int i=0; i<list.size(); i++) {
				int m = list.get(i);
				result.append(m);
				list.remove(i);
				go(index+1);
				list.add(i, m);
				result.deleteCharAt(result.length()-1);
			}
		}
	}

	private static void drawMap(StringBuffer sb) {
		for(int i=0; i<8; i++) {
			map[i][sb.charAt(i)-'1'] = 'M';
		}
		for(int i=0; i<map.length; i++) {
			for (int j = 0; j < map[i].length; j++) {
				System.out.print(map[i][j] + " ");
			}
			System.out.println();
		}
		System.out.println("===============");
		// 地图复原
		for(int i=0; i<map.length; i++) {
			for (int j = 0; j < map[i].length; j++) {
				map[i][j] = '*';
			}
		}
	}

	// 检查是否符合八皇后的位置要求
	private static boolean check(StringBuffer sb) {
		for(int i=0; i<sb.length(); i++) {
			for(int j=i+1; j<sb.length(); j++) {
				if((i-j)==sb.charAt(i)-sb.charAt(j) || ((j-i)==sb.charAt(i)-sb.charAt(j))) {
					return false;
				}
			}
		}
		return true;
	}

}

【蓝桥杯】经典的八皇后问题,布布扣,bubuko.com

时间: 2024-09-30 04:28:34

【蓝桥杯】经典的八皇后问题的相关文章

蓝桥杯 算法提高 8皇后&#183;改 -- DFS 回溯

  算法提高 8皇后·改   时间限制:1.0s   内存限制:256.0MB 问题描述 规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大. 输入格式 一个8*8的棋盘. 输出格式 所能得到的最大数字和 样例输入 1 2 3 4 5 6 7 89 10 11 12 13 14 15 1617 18 19 20 21 22 23 2425 26 27 28 29 30 31 3233 34 35 36 37 38 39 4041 42 43 44 45 46 47 48

洛谷 P1219 八皇后 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1219 题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 5来描述,第i个数字表示在第i行的相应位置有一个棋子,如下: 行号 1 2 3 4 5 6 列号 2 4 6 1 3 5 这只是跳

初学者看待八皇后问题

(原创,未经允许不得转载) 经典的八皇后问题 题目: 八皇后问题就是在8*8的棋盘上放置8个皇后,使其任意两个不在同一行.同一列.同一斜线上. 解题思路: 去掉行这个因素,然后去考虑是否在同一列或同一斜线上.每个摆放成功的棋子在(i,x[i]),然后设置当前行,然后在该行从第一列一直试探到第8列,看是否符合条件,同时只有当当前行之前的棋子都符合条件,才能继续下一行,直到第八行,进行输出. 代码: #include "stdafx.h" #include "iostream&q

Python学习二(生成器和八皇后算法)

看书看到迭代器和生成器了,一般的使用是没什么问题的,不过很多时候并不能用的很习惯 书中例举了经典的八皇后问题,作为一个程序员怎么能够放过做题的机会呢,于是乎先自己来一遍,于是有了下面这个ugly的代码 def table(m, lst): '''绘制m列的棋盘,每行有个皇后旗子''' head = '┌' + '─┬' * (m-1) + '─┐' row = lambda x: '│' + ' │' * x + '╳│' + ' │' * (m - x - 1) trow = '├' + '─

算法入门经典-第七章 例题7-2 八皇后问题

原本利用回溯思想解决的经典八皇后问题,其实也是可以用递归解决的~ 八皇后的递归解决思路: 从第一行开始,依次判断0~8列的哪一列可以放置Queen,这样就确定了该行的Queen的位置,然后行数递增,继而递归实现下一行的判断,依次类推直到行数增加到8(行数从0开始的),此时为递归-----归的条件,即表示一种八皇后的解决方法完成,打印结果:之后进行下一种解决方法的寻找,大致思路个人理解是这样 noDanger(row,j,(*chess)[8])函数是判断第row行第j列是否可以放置Queen #

洛谷 P1219 八皇后【经典DFS,温习搜索】

P1219 八皇后 题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 5来描述,第i个数字表示在第i行的相应位置有一个棋子,如下: 行号 1 2 3 4 5 6 列号 2 4 6 1 3 5 这只是跳棋放置的一个解.请编一个程序找出所有跳棋放置的解.并把它们以上面的序列方法输出.解按字典顺序排列.请输出前3个解.最后一行是解的总个数. //以下的

经典回溯算法(八皇后问题)详解

八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出: 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上 (斜率为1),问有多少种摆法.高斯认为有76种方案. 1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果. 计算机发明后,有多种方法可以解决此问题. 算法思路:    首先我们分析一下问题的解,我们每取出一个皇后,放入一行,共有八种不同的放法

蓝桥杯,算法提高,8皇后&#183;改

题目如下: 问题描述 规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大. 输入格式 一个8*8的棋盘. 输出格式 所能得到的最大数字和 样例输入 1 2 3 4 5 6 7 89 10 11 12 13 14 15 1617 18 19 20 21 22 23 2425 26 27 28 29 30 31 3233 34 35 36 37 38 39 4041 42 43 44 45 46 47 4848 50 51 52 53 54 55 5657 58 59 60

[蓝桥杯][基础练习VIP]2n皇后问题

时间限制: 1Sec 内存限制: 128MB 提交: 26 解决: 18 题目描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行.同一列或同一条对角线上.问总共有多少种放法?n小于等于8. 输入 输入的第一行为一个整数n,表示棋盘的大小. 接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后. 输