Vijos 巧妙填數
阿新 • • 發佈:2017-07-01
using turn otto n) 輸出格式 ostream 全部結果 找到 字典
描述
將1,2,\cdots,91,2,?,9共99個數分成三組,分別組成三個三位數,且使這三個三位數構成1:2:31:2:3的比例。
試求出所有滿足條件的三個三位數。
例如:三個三位數192,384,576192,384,576滿足以上條件。
格式
輸入格式
無輸入。
輸出格式
需要輸出全部結果。每行輸出3個數 用空格隔開。按照字典序的順序輸出。
來源
NOIP 1998 普及組 第一題
1 /* 2 又一個70行模擬 3 先列舉所有以1 2 3為百位的數字作為a 4 再找到相應的b c 5 判斷a b c 是否符合題目要求代碼6 */ 7 #include<cstdio> 8 #include<iostream> 9 #include<algorithm> 10 #define MAXN 12 11 12 using namespace std; 13 14 bool vis[MAXN]; 15 16 int a[300],b,c,n; 17 18 inline bool pd(int x,int y,int z) { 19 if(z>=1000) return false; 20 for(int i=1;i<=10;i++) vis[i]=false; 21 while(x) { 22 int t=x/10; 23 int p=x-t*10; 24 vis[p]=true; 25 x=t; 26 } 27 while(y) { 28 int t=y/10; 29 int p=y-t*10; 30 if(vis[p]==true) return false; 31 vis[p]=true; 32 y=t; 33 } 34 while(z) {35 int t=z/10; 36 int p=z-t*10; 37 if(vis[p]==true) return false; 38 vis[p]=true; 39 z=t; 40 } 41 return true; 42 } 43 44 inline void dfs(int x,int step) { 45 if(step==4) { 46 a[++n]=x; 47 return; 48 } 49 for(int i=1;i<=9;i++) { 50 if(!vis[i]) { 51 vis[i]=true; 52 if(step==2) x+=10*i; 53 if(step==3) x+=i; 54 dfs(x,step+1); 55 vis[i]=false; 56 if(step==2) x-=10*i; 57 if(step==3) x-=i; 58 } 59 } 60 return; 61 } 62 63 int main() { 64 // freopen("1.out","w",stdout); 65 for(int i=1;i<=3;i++) { 66 for(int l=1;l<=10;l++) vis[l]=false; 67 vis[i]=true; 68 dfs(100*i,2); 69 } 70 sort(a+1,a+1+n); 71 for(int i=1;i<=n;i++) { 72 b=a[i]*2; 73 c=a[i]*3; 74 if(pd(a[i],b,c)) printf("%d %d %d\n",a[i],b,c); 75 } 76 // for(int i=1;i<=n;i++) printf("%d\n",a[i]); 77 // printf("%d\n",n); 78 return 0; 79 }
Vijos 巧妙填數