题目描述#
一个十进制整数n,你最多可以任意交换相邻的两个数码k次,请问能得到多少个不同的无前导0的数?
输入#
第一行是一个整数T。 以后每行一个样例,为两个整数n,k。
输出#
每行输出一个样例的结果。
样例输入#
2
10 1
123 2
样例输出#
1
5
样例解释#
第一个样例只能得到10;第二个样例可以得到123,132,231,213,312。
解题思路

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node{
long long num;
int steps;
}Node;
#define MAX_QUEUE 100010
Node queue[MAX_QUEUE];
int front,rear;
#define MAX_HASH 100010
long long hash_set[MAX_HASH];
int hash_size;
int in_hash(long long num){
for(int i=0;i<hash_size;i++){
if(hash_set[i]==num){
return 1;
}
}
return 0;
}
void add_hash(long long num){
if(!in_hash(num)){
hash_set[hash_size++]=num;
}
}
int get_digits(long long n){
if(n==0) return 1;
int count=0;
while(n>0){
count++;
n/=10;
}
return count;
}
long long swap_digits(long long n,int i,int m){
long long upp=100;
long long low=1;
for(int j=0;j<i;j++){
upp*=10;
low*=10;
}
long long a=n/upp;
long long c=n%low;
long long b=(n/low)%100;
if(i==m-2 && (b%10==0)){
return -1;
}
b=(b%10)*10+(b/10);
long long x=a*upp+b*low+c;
return x;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
long long n;
int k;
scanf("%lld %d",&n,&k);
front = rear = 0;
hash_size = 0;
queue[rear].num = n;
queue[rear].steps = 0;
rear++;
add_hash(n);
while(front<rear){
Node current=queue[front++];
if(current.steps>=k){
continue;
}
int m=get_digits(current.num);
for(int i=0;i<m-1;i++){
long long new_num=swap_digits(current.num,i,m);
if(new_num!=-1){
if(!in_hash(new_num)){
add_hash(new_num);
queue[rear].num=new_num;
queue[rear].steps=current.steps+1;
rear++;
}
}
}
}
printf("%d\n",hash_size);
}
return 0;
}
时间超限,正在改进,可以催催,万一我忘记了嘞嘻嘻