• 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
    ",a[i],b,c);
    75     } 
    76 //    for(int i=1;i<=n;i++) printf("%d
    ",a[i]);
    77 //    printf("%d
    ",n);
    78     return 0;
    79 } 
    代码


    作者:乌鸦坐飞机
    出处:http://www.cnblogs.com/whistle13326/
    新的风暴已经出现 怎么能够停止不前 穿越时空 竭尽全力 我会来到你身边 微笑面对危险 梦想成真不会遥远 鼓起勇气 坚定向前 奇迹一定会出现

     
  • 相关阅读:
    FloatingActionButton
    OpenWrt for WR720N
    OpenWrt
    shell修改文件名(二)
    shell修改文件名(一)
    POJ 1300 Door Man(欧拉通路)
    USACO zerosum DFS 1A
    hadoop源代码解读namenode高可靠:HA;web方式查看namenode下信息;dfs/data决定datanode存储位置
    Leetcode-subsets
    单链表的各种操作 笔试 面试
  • 原文地址:https://www.cnblogs.com/whistle13326/p/7103548.html
Copyright © 2020-2023  润新知