啊哈算法-数的全排列

这个代码写的枚举不是书上的每一位都进行枚举,而是从最小排列数枚举到最大排列数(我觉得这样会减少一些时间?),对每一个数的每一位进行重复判断和是不是在1-n的一个判断。

#include<stdio.h>
#include<string.h> 
int main(){
    int n,book[10],min=0,max=0;
    scanf("%d",&n);
    book[0]=1;//遇到有0位直接进行下一次 
    for(int i=1;i<=n;i++) min=min*10+i;
    for(int i=n;i>=1;i--) max=max*10+i;
    for(int i=min;i<=max;i++){
        int flag=1,tem=i;
        memset(book+1,0,sizeof(book));
        for(int j=1;j<=n;j++){
            if(tem%10<=n && book[tem%10]==0) book[tem%10]=1;//在每一位都在1-n的范围内并且没有重复出现 
            else{//有相同的数退出并标记为0 
                flag=0;
                break;
            }
            tem/=10;
        }
        if(flag==0) continue;
        else printf("%d ",i);
    }
    return 0;
}

 

posted @ 2021-12-15 15:37  m2on  阅读(44)  评论(0编辑  收藏  举报