题目要求
给定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);
}