全排列
Posted 让自己不再小小的
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全排列相关的知识,希望对你有一定的参考价值。
HDU 1716
利用 DFS 的回溯产生全排列
DFS 回溯的这点功能是很神奇的
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<cctype> #include<algorithm> #include <vector> #include <queue> using namespace std; #define INF 0x3f3f3f3f #define N 100 int a[10]; int ans[N], k, vis[N]; void DFS(int sum, int num) { if(num==4) { ans[k++]=sum; return ; } for(int i=1; i<=4; i++) { if(!vis[i]&&num==0) { sum+=a[i]*1000; vis[i]=1; DFS(sum, num+1); vis[i]=0; sum-=a[i]*1000; } else if(!vis[i]&&num==1) { sum+=a[i]*100; vis[i]=1; DFS(sum, num+1); vis[i]=0; sum-=a[i]*100; } else if(!vis[i]&&num==2) { sum+=a[i]*10; vis[i]=1; DFS(sum, num+1); vis[i]=0; sum-=a[i]*10; } else if(!vis[i]&&num==3) { sum+=a[i]; vis[i]=1; DFS(sum, num+1); vis[i]=0; sum-=a[i]; } } } int main() { int cnt=0; while(1) { int s=INF; scanf("%d%d%d%d", &a[1], &a[2], &a[3], &a[4]); for(int i=1; i<=4; i++) if(a[i]<s&&a[i]!=0) s=a[i]; if(a[1]==0 && a[2]==0 && a[3]==0 && a[4]==0) break; cnt++; if(cnt!=1) printf("\n"); memset(vis, 0, sizeof(vis)); k=0; DFS(0, 0); sort(ans, ans+24); int f=0; for(int i=0; i<24; i++) { int t=(int)log10(ans[i])+1; if((t==4&&i==0) || (t==4&&ans[i]!=ans[i-1])) { if(ans[i]/1000!=s) { f=0; s=ans[i]/1000; printf("\n"); } if(!f) { printf("%d", ans[i]); f=1; } else printf(" %d", ans[i]); } } printf("\n"); } return 0; }
以上是关于全排列的主要内容,如果未能解决你的问题,请参考以下文章
html 将以编程方式附加外部脚本文件的javascript代码片段,并按顺序排列。用于响应式网站,其中ma
蓝桥杯 三行代码解决 “全排列的价值”(2022省赛pythonA组)
蓝桥杯 三行代码解决 “全排列的价值”(2022省赛pythonA组)