zoukankan      html  css  js  c++  java
  • hdu 2160 Sequence one(DFS)

     1 #include <iostream>
     2 #include <vector>
     3 #include <algorithm>
     4 #include <cstdio>
     5 #include <memory.h>
     6 using namespace std;
     7 #define MAXN 20002
     8 
     9 
    10 //适用于正整数
    11 template <class T>
    12 inline void scan_d(T &ret) {
    13     char c; ret=0;
    14     while((c=getchar())<'0'||c>'9');
    15     while(c>='0'&&c<='9') ret=ret*10+(c-'0'),c=getchar();
    16 }
    17 
    18 int a[1010];
    19 int cnt;
    20 int ans[1010];
    21 int tot;
    22 int n, k;
    23 int flag;
    24 
    25 int check(int i,int j)           //检查是否有出现过的数字
    26 {
    27     while (i < j)
    28         if (a[i++] == a[j])
    29         return 0;
    30     return 1;
    31 }
    32 
    33 void dfs(int now, int num)
    34 {
    35     int i;
    36     if (num == tot) {
    37         ++cnt;
    38         for (i = 0;i < tot-1; ++ i)
    39             printf("%d ",ans[i]);
    40         printf("%d
    ",ans[tot-1]);
    41         if (cnt == k) flag = 1;
    42         return;
    43     }
    44     if (num == 0) {                              //第一次不存在前一个数,特殊处理
    45         for (i = 0;i < n; ++ i) {
    46             if (check(0,i)) {
    47                 ans[num] = a[i];
    48                 dfs(i,1);
    49                 if (flag) return;
    50             }
    51         }
    52     } else {
    53         for (i = now + 1;i < n; ++ i) {
    54             if (a[i] >= a[now] && check(now+1,i)) {
    55                 ans[num] = a[i];
    56                 dfs(i,num + 1);
    57                 if (flag) return;
    58             }
    59         }
    60     }
    61 }
    62 
    63 int main()
    64 {
    65     int i, t;
    66     while (~scanf("%d%d",&n,&k)) {
    67         for (i = 0;i < n; ++ i)
    68             scan_d(a[i]);
    69         cnt = 0;
    70         for (tot = 1;cnt < k; ++ tot) {
    71             flag = 0;
    72             t = cnt;
    73             dfs(0,0);
    74             if (t == cnt || flag) break;              //达到要求个数或者输出完所有可能情况结束
    75         }
    76         puts("");
    77     }
    78     return 0;
    79 }        
    代码君
  • 相关阅读:
    字符串Hash 学习笔记
    P4315 月下“毛景树” 题解
    page
    Equation
    Graph
    配置UOJ数据的正确姿势
    luogu2261余数求和题解--整除分块
    luogu2858奶牛零食题解--区间DP
    luogu1005矩阵取数游戏题解--区间DP
    luogu4677山区建小学题解--区间DP
  • 原文地址:https://www.cnblogs.com/usedrosee/p/4192686.html
Copyright © 2011-2022 走看看