zoukankan      html  css  js  c++  java
  • Gym-102411C

    C - Cross-Stitch

    tag: 构造, 欧拉回路

    题意

    十字绣穿针引线,保证 'X' 八联通

    思路

    这样构造,然后正反跑欧拉回路

    #include<bits/stdc++.h>
    using namespace std;
    
    const int N = 3e5 + 10;
    typedef long long ll;
    
    struct Edge {
        int to, next, id;
    };
    int idcnt;
    struct {
        int head[N], tot;
        int vis[N];
        Edge E[N];
        void addEdge(int from, int to) {
            //cout << from << " " << to << endl;
            int id = ++idcnt;
            E[++tot] = { to, head[from], id };
            head[from] = tot;
    
            E[++tot] = { from,head[to], id };
            head[to] = tot;
        }
    }Edges[2];
    
    int n, m;
    char mp[200][200];
    int id[200][200];
    int ans[N], anscnt;
    
    void dfs(int u, int p) {
        for (int& i = Edges[p].head[u];i;i = Edges[p].E[i].next) {
            int v = Edges[p].E[i].to;
            int id = Edges[p].E[i].id;
            if (!Edges[p].vis[id]) {
                Edges[p].vis[id] = 1;
                //cout << "now : " << u << " nxt : " << v << endl;
                dfs(v, p ^ 1);
                ans[++anscnt] = u;
            }
        }
    }
        
    int main() {
        scanf("%d%d", &m, &n);
    
        for (int i = 1;i <= n;i++) {
            scanf("%s", mp[i] + 1);
        }
        int cnt = 0;
        for (int i = 0;i <= n;i++)for (int j = 0;j <= m;j++)id[i][j] = ++cnt;
        cnt = 0;
        int idx = -1;
        for (int i = 1;i <= n;i++) {
            for (int j = 1;j <= m;j++) {
                if (mp[i][j] == 'X') {
                    Edges[0].addEdge(id[i][j - 1], id[i - 1][j]);
                    Edges[0].addEdge(id[i - 1][j - 1], id[i][j]);
                    idx = id[i - 1][j - 1];
    
                    Edges[1].addEdge(id[i - 1][j - 1], id[i][j - 1]);
                    Edges[1].addEdge(id[i - 1][j], id[i][j]);
    
                    cnt++;
                }
            }
        }
        printf("%d
    ", 4 * cnt - 1);
    
        dfs(idx, 0);
        ans[0] = idx;
    
        for (int i = anscnt;i >= 1;i--) {
            int now = ans[i];
            printf("%d %d
    ", (now - 1) % (m + 1), (now - 1) / (m + 1));
        }
    }
    
  • 相关阅读:
    ObjectiveC字符串处理
    分享 10 个 jQuery 的语言翻译插件
    30 个实用的 jQuery 选项卡/导航教程推荐
    iphoneCocos2D游戏开发
    cocos2d和unity3d的比较
    将NSString转换编码集变为GBK或GB2312
    超过 40 款很有用而且很新的 jQuery 插件
    表格单元的表现形式
    ShareKit
    UI Prototype Design IDE( 界面原型设计工具 )
  • 原文地址:https://www.cnblogs.com/sduwh/p/14471545.html
Copyright © 2011-2022 走看看