HDU 1716 利用 DFS 的回溯产生全排列 DFS 回溯的这点功能是很神奇的
#include#include #include #include #include #include #include #include using namespace std;#define INF 0x3f3f3f3f#define N 100int 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]