zoukankan      html  css  js  c++  java
  • poj 1780 , poj 1392 欧拉回路求前后相互衔接的数字串

    两道题目意思差不多

    第一题是10进制 , 第二题是2进制的

    都是利用欧拉回路的fleury算法来解决

    因为我总是希望小的排在前面,所以我总是先将较小数加入栈,再利用另一个数组接收答案,但是这里再从栈中导出来答案要倒一下了,这一点要注意

    poj 1780

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <cmath>
     4 using namespace std;
     5 #define N 1000010
     6 
     7 int ans[N] , cnt[N] , stack[N];
     8 int top1 , top2;
     9 int mod;
    10 void euler(int v)
    11 {
    12     while(cnt[v]<10)
    13     {
    14         int w=v*10+cnt[v];
    15         cnt[v]++;
    16         stack[top1++]=w;
    17         v=w%mod;
    18     }
    19 }
    20 
    21 int main()
    22 {
    23   //  freopen("in.txt" , "r" , stdin);
    24     int n;
    25     while(scanf("%d" , &n) , n)
    26     {
    27         top1 = 0 , top2 = 0 , mod = (int)pow(10.0,(n-1)*1.0);
    28         stack[top1++] = 0;
    29         memset(cnt , 0 , sizeof(cnt));
    30         cnt[0]++;
    31         while(top1)
    32         {
    33             ans[top2++] = stack[--top1];
    34             int v = ans[top2-1]/10;
    35             euler(v);
    36         }
    37         for(int i=1 ; i<=n ; i++) printf("%d" , 0);
    38         for(int i=top2-1 ; i>=1 ; i--) printf("%d" , ans[i]%10);
    39         puts("");
    40     }
    41     return 0;
    42 }

    poj 1392

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 
     5 using namespace std;
     6 #define N (1<<16)
     7 
     8 int ans[N] , cnt[N] , stack[N];
     9 int top1 , top2 , mod;
    10 
    11 void euler(int v , int mod)
    12 {
    13     while(cnt[v]<2)
    14     {
    15         int w=v*2+cnt[v];
    16         cnt[v]++;
    17         stack[top1++]=w;
    18         v=w%mod;
    19     }
    20 }
    21 
    22 int q_pow(int a , int b)
    23 {
    24     int ans = 1;
    25     while(b)
    26     {
    27         if(b&1) ans *= a;
    28         a*=a;
    29         b>>=1;
    30     }
    31     return ans;
    32 }
    33 
    34 int main()
    35 {
    36    // freopen("in.txt" , "r" , stdin);
    37     int n,k;
    38     while(scanf("%d%d" , &n , &k) , n||k)
    39     {
    40         top1=top2=0;
    41         memset(cnt , 0 , sizeof(cnt));
    42         stack[top1++] = 0;
    43         mod = q_pow(2 , n-1);
    44         while(top1)
    45         {
    46             ans[top2++] = stack[--top1];
    47             int v=stack[top1]/2;
    48             euler(v , mod);
    49         }
    50         int index = top2-k-1;
    51         printf("%d
    " , ans[index]);
    52     }
    53     return 0;
    54 }
  • 相关阅读:
    C语言 · 最大最小值
    C语言 · 三个整数的排序
    C语言 · 简单加法
    C语言 · FJ的字符串
    C语言 · 分解质因数
    C语言 · 数的统计
    C语言 · 成绩的等级输出
    C语言 · 区间K大数查询
    shell学习目录
    数据库学习目录
  • 原文地址:https://www.cnblogs.com/CSU3901130321/p/4467807.html
Copyright © 2011-2022 走看看