`
SavageGarden
  • 浏览: 216121 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

三种语言实现36选7的全排列

阅读更多

java版

package com.swfml.test;

/**
 * 生成从m中取n个数的全排列(m > n > 0)
 * <p>思路:
 * <p>取n的数的全排列可看做数组值从(以从1到5取3个数为例)
 * <p>1, 2, 3
 * <p>变化到
 * <p>5, 4, 3
 * @author SavageGarden
 *
 */
public class Test {
	/**
	 * M值
	 */
	public static int M = 5;
	/**
	 * N值
	 */
	public static int N = 4;
	/**
	 * 记录数组(排列组合)的最小状态位
	 */
	public static int[] arrayMin = new int[N];
	/**
	 * 记录数组(排列组合)的最大状态位
	 */
	public static int[] arrayMax = new int[N];
	/**
	 * 初始化数组(排列组合)的最小状态位
	 */
	public static void initArrayMin() {
		for(int i = 0; i < N; i ++) {
			arrayMin[i] = i + 1;
		}
	}
	/**
	 * 初始化数组(排列组合)的最大状态位
	 */
	public static void initArrayMax() {
		for(int i = 0; i < N; i ++) {
			arrayMax[i] = M - i;
		}
	}
	/**
	 * 打印输出数组(排列组合)
	 * @param array
	 */
	public static void printArray(int[] array) {
		for(int i = 0; i < array.length; i ++) {
			System.out.print(array[i] + "\t");
		}
		System.out.println();
	}
	/**
	 * 判断数值在数组中(索引之前)是否存在
	 * @param array		数组
	 * @param index		索引
	 * @param value		数值
	 * @return
	 */
	public static boolean checkExit(int[] array, int index, int value) {
		for(int i = 0; i <= index; i ++) {
			if(array[i] == value) {
				return true;
			}
		}
		return false;
	}
	/**
	 * 获取数组(排列组合)当前索引的下一个位置的值
	 * @param array
	 * @param index
	 * @return
	 */
	public static int getNextValue(int[] array, int index) {
		for(int i = 0; i < M; i ++) {
			if(!checkExit(array, index, i + 1)) {
				return i + 1;
			}
		}
		return 0;
	}
	/**
	 * 根据数组(排列组合)的状态位,返回下一个数组(排列组合)的状态位
	 * @param array
	 * @param index
	 */
	public static int[] getNextArray(int[] array, int index) {
		int value = array[index] + 1;
		while(checkExit(array, index, value)) {
			value ++;
		}
		if(value <= M) {
			array[index] = value;
			if(index < N - 1) {
				while(index < N - 1) {
					value = getNextValue(array, index);
					index ++;
					array[index] = value;
				}
			}
			return array;

		} else {
			index--;
			if(index == -1) {
				return null;
			}
			return getNextArray(array, index);
		}
	}
	public static void getAll() {
		initArrayMin();
		initArrayMax();		

		printArray(arrayMin);
		int[] temp;
		while((temp = getNextArray(arrayMin, N - 1)) != null) {
			printArray(temp);
		}
		printArray(arrayMax);
	}
	public static void main(String args[]) {
		getAll();
	}
}

 JavaScript版

<html>
	<body>
		<div id="message"/>
	</body>
</html>
<script>
	//M值
	var M = 5;
	//N值
	var N = 3;
	//记录数组(排列组合)的最小状态位
	var arrayMin = new Array(N);
	//记录数组(排列组合)的最大状态位
	var arrayMax = new Array(N);
	var message = "<textarea cols='100' rows='50'>";
	/**
	 * 初始化数组(排列组合)的最小状态位
	 */
	function initArrayMin() {
		for(var i = 0; i < N; i ++) {
		     arrayMin[i] = i + 1;
		}	
	}
	/**
	 * 初始化数组(排列组合)的最大状态位
	 */
	function initArrayMax() {
		for(var i = 0; i < N; i ++) {
			arrayMax[i] = M - i;
		}
	}
	/**
	 * 打印输出数组(排列组合)
	 * @param array
	 */
	function printArray(array) {
		for(var i = 0; i < array.length; i ++) {
			message += array[i] + "\t";
		}
		message += "\n";
	}
	/**
	 * 判断数值在数组中(索引之前)是否存在
	 * @param array		数组
	 * @param index		索引
	 * @param value		数值
	 * @return
	 */
	function checkExit(array, index, value) {
		for(var i = 0; i <= index; i ++) {
			if(array[i] == value) {
				return true;
			}
		}
		return false;
	}
	/**
	 * 获取数组(排列组合)当前索引的下一个位置的值
	 * @param array
	 * @param index
	 * @return
	 */
	function getNextValue(array, index) {
		for(var i = 0; i < M; i ++) {
			if(!checkExit(array, index, i + 1)) {
				return i + 1;
			}
		}
		return 0;
	}
	/**
	 * 根据数组(排列组合)的状态位,返回下一个数组(排列组合)的状态位
	 * @param array
	 * @param index
	 */

	function getNextArray(array, index) {
		var value = array[index] + 1;
		while(checkExit(array, index, value)) {
			value ++;
		}
		if(value <= M) {
			array[index] = value;
			if(index < N - 1) {
				while(index < N - 1) {
					value = getNextValue(array, index);
					index ++;
					array[index] = value;
				}

			}
			return array;

		} else {
			index--;
			if(index == -1) {
				return null;
			}
			return getNextArray(array, index);
		}
	}

	function getAll() {
		initArrayMin();
		initArrayMax();

		printArray(arrayMin);
		var temp;
		while((temp = getNextArray(arrayMin, N - 1)) != null) {
			printArray(temp);
		}
		message += "</textarea>";
		document.getElementById("message").innerHTML = message;

	}

	getAll();

</script>

 C版

#include <stdio.h>
#define M 5
#define N 4
/* 记录数组(排列组合)的最小状态位 */
int arrayMin[N];
/* 记录数组(排列组合)的最大状态位 */
int arrayMax[N];
void initArrayMin();
void initArrayMax();
void printArray(int *array);
int checkExit(int *array, int index, int value);
int getNextValue(int *array, int index);
int *getNextArray(int *array, int index);
void getAll();
/* 初始化数组(排列组合)的最小状态位 */
void initArrayMin()
{
    int i;
    for(i = 0; i < N; i ++)
    {
        arrayMin[i]= i + 1;
    }
}
/* 初始化数组(排列组合)的最大状态位 */
void initArrayMax()
{
    int i;
    for(i = 0; i < N; i ++)
    {
        arrayMax[i] = M - i;
    }
}
/* 打印输出数组(排列组合) */
void printArray(int *array)
{
    int i;
    for(i = 0; i < N; i ++)
    {
        printf("%d\t", *(array + i));
    }
    printf("\n");
}
/* 判断数值在数组中(索引之前)是否存在 */
int checkExit(int *array, int index, int value)
{
    int i;
    for(i = 0; i <= index; i ++) {
        if(*(array + i) == value) {
            return 1;
        }
    }
    return 0;
}
/* 获取数组(排列组合)当前索引的下一个位置的值 */
int getNextValue(int *array, int index)
{
    int i;
    for(i = 0; i < M; i ++) {
        if(!checkExit(array, index, i + 1)) {
            return i + 1;
        }
    }
    return 0;
}
/* 根据数组(排列组合)的状态位,返回下一个数组(排列组合)的状态位 */
int *getNextArray(int *array, int index)
{
    int value = *(array + index) + 1;
    while(checkExit(array, index, value) == 1) {
        value ++;
    }
    if(value <= M) {
        *(array + index) = value;
        if(index < N - 1) {
            while(index < N - 1) {
                value = getNextValue(array, index);
                index ++;
                *(array + index) = value;
            }
        }
        return array;
    } else {
        index--;
        if(index == -1) {
            return NULL;
        }
        return getNextArray(array, index);
    }
}
void getAll()
{
    initArrayMin();
    initArrayMax();

    printArray(arrayMin);
    int *temp;
    while((temp = getNextArray(arrayMin, N - 1)) != NULL) {
        printArray(temp);
    }
}
void main()
{
    getAll();
}
0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics