码迷,mamicode.com
首页 > 其他好文 > 详细

Vijos 巧妙填数

时间:2017-07-01 22:33:50      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:include   int   min   isp   判断   vijos   line   组成   logs   

描述

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 巧妙填数

标签:include   int   min   isp   判断   vijos   line   组成   logs   

原文地址:http://www.cnblogs.com/whistle13326/p/7103548.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!