几个比较经典的算法问题的java实现

1.八皇后问题

 1 public class EightQueen {
 2
 3     private static final int ROW = 16;
 4     private static final int COL = 16;
 5
 6     private static int count = 0; // 八皇后的解的个数
 7
 8     private static boolean[][] maps = new boolean[ROW][COL]; // 初始化二维数组,模拟8*8棋盘,默认值是false表示没有皇后
 9
10     // 如何去放皇后?
11     /**
12      * 防止第row行的皇后
13      * @param row
14      */
15     public static void putQueen(int row) {
16
17         // 递归的出口
18         if (row == ROW) { // row=8时,已经到了第9行,那么前面的8行就是OK的
19             printQueen();
20             return;
21         }
22
23         // 把皇后放到第row行的第j列
24         for (int j = 0; j < COL; j++) {
25             // 如果可以放,就将皇后放在该点
26             if (isOK(row, j)) {
27                 maps[row][j] = true;
28                 putQueen(row + 1); // 该行放好之后放下一行【递归去放皇后】,算法已经跳转
29                 maps[row][j] = false; // 回溯,当放row+1行棋子不满足的时候,会回溯到第row行
30             }
31         }
32     }
33
34     // 如果要将皇后放在(x,y)点,则需要先判断该点是否可以放
35     public static boolean isOK(int x, int y) {
36
37         // 遍历二维数组,判断4个方向是否存在皇后
38         for (int i = 0; i < ROW; i++) {
39             for (int j = 0; j < COL; j++) {
40                 // 正斜边x-y定值,逆斜边x+y为定值
41                 if (i == x || j == y || i - j == x - y || i + j == x + y) {
42                     // 判断4个方向是否存在皇后
43                     if (maps[i][j]) { // 如果该点放了一个皇后,则返回false
44                         return false;
45                     }
46                 }
47             }
48         }
49
50         return true;
51     }
52
53     public static void printQueen() {
54
55         System.out.println("第" + (++count) + "个解");
56         System.out.println("*******************");
57         for (int i = 0; i < ROW; i++) {
58             for (int j = 0; j < COL; j++) {
59                 if (maps[i][j]) {
60                     System.out.print("Q ");
61                 } else {
62                     System.out.print("* ");
63                 }
64             }
65             System.out.println();
66         }
67     }
68
69     public static void main(String[] args) {
70
71         putQueen(0);
72     }
73 }

2.豆机(梅花瓶,高尔顿瓶问题)

3.

时间: 2024-07-31 15:55:13

几个比较经典的算法问题的java实现的相关文章

经典KMP算法C++与Java实现代码

前言: KMP算法是一种字符串匹配算法,由Knuth,Morris和Pratt同时发现(简称KMP算法).KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.比较流行的做法是实现一个next()函数,函数本身包含了模式串的局部匹配信息.由于next函数理解起来不太容易,本文同样是基于空间换时间的做法,但将采用另一种代码实现,希望可以更方便读者理解! 测试数据 aseeesatba esat as330kdwejjl_8 jjl_ faw4etoesting

一文搞定十大经典排序算法(Java实现)

本文总结十大经典排序算法及变形,并提供Java实现. 参考文章: 十大经典排序算法总结(Java语言实现) 快速排序算法—左右指针法,挖坑法,前后指针法,递归和非递归 快速排序及优化(三路划分等) 一.排序算法概述 1.定义 将杂乱无章的数据元素,通过一定的方法按关键字顺序排列的过程叫做排序. 2.分类 十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间非比较类排序:不通过比较

经典排序算法 - 冒泡排序Bubble sort

 原文出自于 http://www.cnblogs.com/kkun/archive/2011/11/23/bubble_sort.html 经典排序算法 - 冒泡排序Bubble sort 原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子 例子为从小到大排序, 原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 | 第一趟排序(外循环) 第

经典排序算法

经典排序算法(via  kkun) 经典排序算法,以下文章参考了大量网上的资料,大部分都给出了出处 这一系列重点在理解,所以例子什么的都是最简单的情况,难免失误之处,多指教 大多数排序算法都给出了每一步的状态,以方便初学者更容易理解,通俗易懂,部分难以理解的排序算法则给出了大量的图示,也算是一个特色吧 经典排序算法 - 快速排序Quick sort 经典排序算法 - 桶排序Bucket sort 经典排序算法 -  插入排序Insertion sort 经典排序算法 - 基数排序Radix so

C#实现所有经典排序算法

C# 实现所有经典排序算法 1 .选择排序 选择排序 原理: 选择排序是从冒泡排序演化而来的,每一轮比较得出最小的那个值,然后依次和每轮比较的第一个值进行交换. 目的:按从小到大排序. 方法:假设存在数组:72, 54, 59, 30, 31, 78, 2, 77, 82, 72 第一轮依次比较相邻两个元素,将最小的一个元素的索引和值记录下来,然后和第一个元素进行交换. 如上面的数组中,首先比较的是72,54,记录比较小的索引是54的索引1.接着比较54和59,比较小的索引还是1.直到最后得到最

经典滤波算法总结

第1种方法限幅滤波法(又称程序判断滤波法) A方法 根据经验判断,确定两次采样允许的最大偏差值(设为A) 每次检测到新值时判断: 如果本次值与上次值之差<=A,则本次值有效 如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值 B优点 能有效克服因偶然因素引起的脉冲干扰 C缺点 无法抑制那种周期性的干扰 平滑度差 /* A 值可根据实际情况调整 value 为有效值,new_value 为当前采样值 滤波程序返回有效的实际值 */ #define A 10 char val

经典白话算法之归并排序

void Merge(int A[],int p,int q,int r){ int i,j,k; //计算子数组A[p..q]的元素个数 int n1 = q - p + 1; //计算子数组A[q+1..r]元素个数 int n2 = r - q; //创建子数组L,R int* L = (int*)malloc(sizeof(int)*(n1+1)); int* R = (int*)malloc(sizeof(int)*(n2+1)); //将子数组A[p..q]赋值到L数组 for(i

经典白话算法之快速排序

[分析] [伪代码] [运行过程] [代码] /********************************* * 日期:2014-04-01 * 作者:SJF0115 * 题目:快速排序 **********************************/ #include <iostream> #include <stdio.h> using namespace std; //对子数组array[p...r]就地重排 int Partition(int array[],i

经典排序算法的PHP实现类

近期广受笔试摧残,对于各种排序也是晕头转向. 更坑爹的是貌似大多都是用C++.Java实现相关算法,让我搞PHP的情何以堪,更何况,PHP本身就有排序函数sort(),其实来说,是很简单的,这也可能是为什么不用PHP进行排序吧. 但考虑到PHP毕竟也是一门面向对象的语言吧,我们利用原生的语法,也是可以实现经典排序算法的,先不说性能如何,切不要妄自菲薄吧. 下面为具体的经典排序算法的PHP实现类. <?php /** * Author: helen * CreateTime: 2016/4/15