啊哈算法-数的全排列
这个代码写的枚举不是书上的每一位都进行枚举,而是从最小排列数枚举到最大排列数(我觉得这样会减少一些时间?),对每一个数的每一位进行重复判断和是不是在1-n的一个判断。
#include#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; }