JAVA\C-N个可重复数字组成N位数的问题

61 篇文章 3 订阅

题目要求

给定N个0-9的数字(可重复)输出所有可能的N位数即它们的总数,N位数输出时按照由小到大的顺序输出。N位数总数在最后一行输出。

样例输入

第一行输入个数N,第二行有N个数字,分别代表N个可用的数字(0-9),可以重复,用空格隔开。

4
0 1 2 2

样例输出

每一个N位数占用一行,从小到大输出,最后一行输出总个数

1022
1202
1220
2012
2021
2102
2120
2201
2210
9

思路

深搜加回溯

代码

JAVA

import java.util.Scanner;
public class 组数问题 {
	static int N;						//给定数字的个数
	static int total = 0;				//可能的N位数的总数
	static int[] num;					//存储可能的N位数的每一位
	static int[] flag = new int[10];	//存储0-9每个数字各有多少个
	
	static void dfs(int pos) {			//深搜
		if(pos==N) {
			total++;
			String result="";
			for(int i = 0; i<N; i++)	result+=num[i];
			System.out.println(result);
			return;
		}
		int i = pos==0? 1:0;			//因为第一位不能是0,所以需要在此判断一下for循环的开始,若是第一位则从1开始否则从0开始
		for(; i<10; i++)
			if(flag[i]>0) {
				flag[i]--;
				num[pos]=i;
				dfs(pos+1);
				flag[i]++;				//回溯
			}
	}
    
    public static void main(String[] args) {
    	Scanner scaner = new Scanner(System.in);
    	N = scaner.nextInt();
    	num = new int[N];
    	for (int i = 0; i < N; i++)	flag[scaner.nextInt()]++;
    	scaner.close();
    	dfs(0);
    	System.out.println(total);
    }
}

C

#include<stdio.h>
int N,total=0,num[100];flag[10];
void dfs(int pos){
    if(pos==N){
        total++;
        for(int i=0; i<N; i++)
            if(i!=N-1)  printf("%d",num[i]);
            else        printf("%d\n",num[i]);
        return;
    }
    int i=pos==0? 1:0;
    for(;i<10;i++)
        if(flag[i]>0){
            flag[i]--;
            num[pos]=i;
            dfs(pos+1);
            flag[i]++;
        }
}
int main(void){
    int temp;
    scanf("%d",&N);
    for(int i=0; i<N; i++){
        scanf("%d",&temp);
        flag[temp]++;
    }
    dfs(0);
    printf("%d\n",total);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值