Vijos 巧妙填数
Posted 心之所向 素履以往
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vijos 巧妙填数相关的知识,希望对你有一定的参考价值。
描述
将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 巧妙填数的主要内容,如果未能解决你的问题,请参考以下文章