POJ2718【DFS】
生活随笔
收集整理的這篇文章主要介紹了
POJ2718【DFS】
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題意:
給你0到9之間的數(shù),然后讓你搞成兩個(gè)數(shù),求一個(gè)最小差異值(被組合的數(shù)不允許出現(xiàn)前導(dǎo)0)
思路:最小差異那么肯定是有一個(gè)整數(shù)長n/2,另一個(gè)長n-n/2,搜一下就好了。
code:
#include<cstdio> #include<string.h> #include<iostream> #include<algorithm> using namespace std;next_permutation(first,end); 按照字典序列,搞出比他下面的那些排列/* int main() {int a[3];for(int i=0;i<3;i++)cin>>a[i];while(next_permutation(a,a+3)){for(int i=0;i<3;i++){printf("%d",a[i]);}puts("");} } */#define INF 0X3f3f3f3f int a[15]; bool vis[15]; int b[15]; int n; int ans; char s[1010];//另一半直接搞全排列,然后直接判斷取小就行了 void solve(int aa) {int len=0;int bb;for(int i=0; i<n; i++){if(!vis[i]){b[len++]=a[i];}}bb=0;for(int i=0; i<len; i++)bb=bb*10+b[i];sort(b,b+len);if(len==1||b[0]!=0)ans=min(abs(bb-aa),ans);while(next_permutation(b,b+len)){bb=0;for(int i=0; i<len; i++)bb=bb*10+b[i];if(len==1||b[0]!=0)ans=min(abs(bb-aa),ans);} }//先搜出一個(gè)數(shù); void DFS(int k,int res) {if(k==n/2){solve(res);return;}for(int i=0; i<n; i++){if(!vis[i]){if(a[i]==0&&k==0&&n>3)continue;vis[i]=1;DFS(k+1,res*10+a[i]);vis[i]=0;}} } //兩個(gè)輸入方式 void made1() {gets(s);n=0;int len=strlen(s);for(int i=0; i<len; i++){if(s[i]==' ')continue;else{a[n++]=s[i]-'0';//printf("%d ",a[n-1]);}} } void made2() {n=0;char ch;while((ch=getchar())!='\n'){if(ch==' ')continue;a[n++]=ch-'0';} }int main() {int T;scanf("%d",&T);getchar();while(T--){//made1();made2();memset(vis,0,sizeof(vis));ans=INF;DFS(0,0);printf("%d\n",ans);}return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/keyboarder-zsq/p/5934504.html
總結(jié)
以上是生活随笔為你收集整理的POJ2718【DFS】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Scala模式匹配和类型系统
- 下一篇: 台阶问题练习题 (简单的dp)