zoukankan      html  css  js  c++  java
  • POJ 1780 Code 欧拉回路+手写栈DFS

    和西安邀请赛那道题题目差不多,现在终于会手写栈了,自己琢磨了好久,真是感动TAT

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <climits>
    #include <string>
    #include <iostream>
    #include <map>
    #include <cstdlib>
    #include <set>
    #include <queue>
    #include <stack>
    
    using namespace std;
    
    typedef long long LL;
    const int maxn = 1e6 + 100;
    int n,ans[maxn],lim,p10[10],vnow[maxn];
    int s[maxn],top,spos[maxn];
    bool hs[maxn];
    
    void dfs1() {
        memset(vnow,0,sizeof(vnow));
        top = 0;
        for(int i = 0;i < lim;i++) ans[i] = 0;
        hs[0] = true;
        vnow[0] = 1;
        s[top] = 0;
        spos[top] = n;
        top++;
        while(top > 0) {
            int w = s[top - 1],pos = spos[top - 1];
            if(pos == lim) break;
            if(vnow[w] == 10) {
                hs[w] = false;
                vnow[w] = 0;
                top--;
            }
            for(;vnow[w] < 10;vnow[w]++) {
                int vv = w * 10 % p10[n] + vnow[w];
                if(!hs[vv]) {
                    hs[vv] = true;
                    s[top] = vv; spos[top] = pos + 1; top++;
                    vnow[w]++;
                    ans[pos] = vv;
                    break;
                }
            }
        }
    }
    
    bool dfs(int now) {
        bool ret = false;
        if(now == lim) return true;
        for(int i = 0;i < 10;i++) {
            int val = 0;
            if(now >= n - 1) val = ans[now - 1] * 10 % p10[n] + i;
            if(now >= n) {
                if(!hs[val]) {
                    hs[val] = true;
                    ans[now] = val;
                    ret |= dfs(now + 1);
                    hs[val] = false;
                }
            }
            else if(now == n - 1) {
                hs[val] = true;
                ans[now] = val;
                ret |= dfs(now + 1);
                hs[val] = false;
            }
            else { 
                ans[now] = i;
                ret |= dfs(now + 1);
            }
            if(ret) break;
        }
        return ret;
    }
    
    void solve() {
        memset(hs,0,sizeof(hs));
        lim = p10[n] + n - 1;
        dfs1();
        for(int i = 0;i < lim;i++) printf("%d",ans[i] % 10);
        puts("");
        /*
        memset(hs,0,sizeof(hs));
        dfs(0);
        for(int i = 0;i < lim;i++) printf("%d",ans[i] % 10);
        puts("");
        */
    }
    
    int main() {
        p10[0] = 1;
        for(int i = 1;i < 10;i++) p10[i] = p10[i - 1] * 10;
        while(scanf("%d",&n),n) solve();
        return 0;
    }
    

      

  • 相关阅读:
    ORA-12543: TNS:destination host unreachable
    Visual Studio 2008 连接云端 visualstudio.com
    将博客搬至CSDN
    Shiro 系列笔记(一)
    Centos 6.7 安装jdk
    Centos service启动失败原因--权限问题
    form表单提交的ajax形式
    slf4j与mybatis结合显示sql
    Docker 部署 redis教程,附带部分小建议,防止踩坑
    Android中的EditText默认时不弹出软键盘的方法
  • 原文地址:https://www.cnblogs.com/rolight/p/3863261.html
Copyright © 2011-2022 走看看