`

用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列

    博客分类:
  • java
阅读更多
题目如下:用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。



static int[] bits = new int[] { 1, 2, 3, 4, 5 };

/**
 * @param args
 */
public static void main(String[] args) {
sort("", bits);
}

private static void sort(String prefix, int[] a) {
if (a.length == 1) {
System.out.println(prefix + a[0]);
}

for (int i = 0; i < a.length; i++) {
sort(prefix + a[i], copy(a, i));
}
}

private static int[] copy(int[] a,int index){
int[] b = new int[a.length-1];
System.arraycopy(a, 0, b, 0, index);
System.arraycopy(a, index+1, b, index, a.length-index-1);
return b;
}


**********************************************************************

  基本思路:
1 把问题归结为图结构的遍历问题。实际上6个数字就是六个结点,把六个结点连接成无向连通图,对于每一个结点求这个图形的遍历路径,所有结点的遍历路径就是最后对这6个数字的排列组合结果集。
2 显然这个结果集还未达到题目的要求。从以下几个方面考虑:
  1. 3,5不能相连:实际要求这个连通图的结点3,5之间不能连通, 可在构造图结构时就满足改条件,然后再遍历图。
  2. 不能有重复: 考虑到有两个2,明显会存在重复结果,可以把结果集放在TreeSet中过滤重复结果
  3. 4不能在第三位: 仍旧在结果集中去除满足此条件的结果。

采用二维数组定义图结构,最后的代码是:

import java.util.Iterator;
import java.util.TreeSet;

public class TestQuestion {

private String[] b = new String[]{"1", "2", "2", "3", "4", "5"};
private int n = b.length;
private boolean[] visited = new boolean[n];
private int[][] a = new int[n][n];
private String result = "";
private TreeSet set = new TreeSet();

public static void main(String[] args) {
new TestQuestion().start();
}

private void start() {

// Initial the map a[][]
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i == j) {
a[i][j] = 0;
} else {
    a[i][j] = 1;
}
}
}

// 3 and 5 can not be the neighbor.
a[3][5] = 0;
a[5][3] = 0;

// Begin to depth search.
for (int i = 0; i < n; i++) {
    this.depthFirstSearch(i);
}

// Print result treeset.
Iterator it = set.iterator();
while (it.hasNext()) {
String string = (String) it.next();
// "4" can not be the third position.
if (string.indexOf("4") != 2) {
System.out.println(string);
}
}
}

private void depthFirstSearch(int startIndex) {
visited[startIndex] = true;
result = result + b[startIndex];
if (result.length() == n) {
// Filt the duplicate value.
set.add(result);
}
for(int j = 0; j < n; j++) {
if (a[startIndex][j] == 1 && visited[j] == false) {
depthFirstSearch(j);
} else {
continue;
}
}

// restore the result value and visited value after listing a node.
    result = result.substring(0, result.length() -1);
    visited[startIndex] = false;
}
}
分享到:
评论
1 楼 allen3010 2012-12-12  
1,2,3,4,5这六个数字。。。。。

相关推荐

    一个关于java实现的迭代用法例子,太经典了

    用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求: "4 "不能在第三位, "3 "与 "5 "不能相连.

    JAVA多线程运用

    3. 修改实验1第2题的程序,添加适当代码,以确保每个数字都恰好只被打印一次。 实验步骤: (1)、创建三个类Counter, Printer,Storage (2)、 创建TestCounter类,在该类中定义main函数,在main函数中定义Storage...

    java递归实现 阶乘

    )是5 × 4 × 3 × 2 × 1 = 120。递归方法计算阶乘的基本思路是:n! = n × (n - 1)!,当n为1时,1! = 1,这是递归的基础情况。 在Java中,我们可以创建一个名为`factorial`的方法,该方法接受一个整数n作为参数...

    只用三行代码就从一千个数字随机选出了一百个不同的数字!

    这里我们将详细讲解如何实现这一功能,并分析给出的两个文件——Swap.java和RandomNum.java。 首先,让我们了解基本的随机数生成。在Java中,`java.util.Random`类是用于生成随机数的核心工具。我们可以创建一个`...

    数字旋转方阵(java)

    在本实验中,任务是创建一个Java程序,用于输出顺时针旋转的数字方阵。这个方阵的特性是从中心开始,数字按照顺时针方向填充。给定的代码片段是用C++编写的,但我们可以将其转换为Java语言,并解释其工作原理。 ...

    java编写一个乘法表

    - **主方法**:`public static void main(String[] args)` 是Java程序的入口点,所有Java应用程序都必须包含这样一个方法。 - **成员方法**:`static void cfb()` 是类`ChengFaBiao`的一个静态方法,用于生成乘法表...

    JAVA实现求1到1万之间所有回文数

    在编程领域,回文数是一个十分有趣的主题,它是指一个正读反读都能得到相同结果的数字,例如121、12321等。本篇将详细讲解如何使用Java编程语言来实现求解1到1万之间所有回文数的算法。 首先,我们需要理解如何判断...

    Java:打印出100以内的质数

    在这个任务中,我们将探讨如何使用Java来打印出100以内的所有质数。 首先,我们需要了解找到质数的基本算法。一种常见的方法是“埃拉托斯特尼筛法”(Sieve of Eratosthenes),但在这里,由于范围较小(1到100),...

    java随机生成数字和字母

    本文将通过一个简单的示例程序来介绍如何使用Java生成随机的字母。 #### 二、基础知识 在开始之前,我们需要了解以下几个基础概念: - **`java.util.Random`类**:Java中的`Random`类提供了一种方式来生成伪随机数...

    Java2上机实践1初识java

    在本实践课程“Java2上机实践1初识java”中,我们将深入探索Java编程的基础概念,通过一系列有趣的实例来加深理解。这个压缩包包含了实验1的相关材料,旨在引导我们逐步掌握Java语言的核心特性。 首先,我们要从"猜...

    java打印可对齐的任意层数的杨辉三角形

    Java打印可对齐的任意层数的杨辉三角形是一个典型的编程问题,它涉及到递归、数组和控制流等基础知识。杨辉三角形,又称帕斯卡三角形,是数学中一个有趣的图形,每一行的数字是上一行相邻两个数字之和。在编程中,...

    java用线程两种方式

    在这个main方法中,程序通过两种方式创建了两个线程:一个打印1到1000之间的所有奇数,另一个打印所有偶数。通过使用while循环,程序会持续运行直到两个线程都完成了它们的任务。 总结来说,Java通过两种方式提供了...

    兰州大学马俊java实验1

    这个数列的每一个数字是前两个数字的和,通常以0和1作为起始项。数列的前几项是0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...。Fibonacci数列在计算机科学中有着广泛的应用,比如算法设计、数据分析、图形学等。 在Java中...

    多线程 打印1-99,100-199

    根据实验需求,我们需要创建两个子线程,分别打印从 1 到 99 和从 100 到 199 的数字,并且这两个线程需要交替打印数字。 **3.1 创建打印线程** 首先,我们创建两个类 `Test1` 和 `Test2` 来代表两个子线程,它们...

    用java写的模拟彩票 随机选号

    `main`方法展示了如何创建一个`Lottery`实例并打印出随机生成的号码。 这个项目可以帮助初学者理解Java类的创建、对象的实例化、随机数生成以及集合类的使用。对于更高级的开发者,还可以扩展这个项目,例如添加...

    用Java编译一个计算器

    本教程将详细介绍如何使用Java编写一个简单的计算器,实现基本的加、减、乘、除功能,这对于初学者来说是一个很好的学习项目。 首先,我们需要了解Java的基础语法和面向对象编程的概念。在Java中,每个程序都是由一...

    java实现Fibonacci数列

    根据给定文件的信息,我们可以详细地探讨如何使用Java来实现Fibonacci数列,并通过具体的代码示例来深入了解这一主题。 ### Java实现Fibonacci数列 #### 1. Fibonacci数列简介 Fibonacci数列是一系列数字,其中每...

    java打印100以内的素数

    Java打印100以内的素数是一个常见的编程练习,它涉及到基础的算法设计和Java编程技巧。素数是大于1的自然数,除了1和它自身外,不能被其他自然数整除的数。在Java中,我们可以通过一系列步骤来实现这个功能。 首先...

    java开发技术调用rendom函数,随机生成32位不重复的字符

    在main方法中,我们使用了一个循环来生成50个32位随机字符串,然后将生成的随机字符串打印出来。 四、优点和缺点 使用Random函数生成随机数的优点是非常简单方便,代码量少,效率高。但是,使用Random函数生成...

    文曲星游戏-猜数字JAVA代码.

    ### 文曲星游戏-猜数字JAVA代码解析 #### 背景介绍 “猜数字”是一种经典的思维训练游戏,尤其在学生群体中非常流行。玩家需要根据系统随机生成的一个四位数(每位数字不重复),通过猜测尝试找出这个数字。每猜一...

Global site tag (gtag.js) - Google Analytics