SGU101 Domino

来源:互联网 发布:网络连接那有个小叉号 编辑:程序博客网 时间:2024/05/22 06:21
将骨牌上的数字看作点,骨牌看作连接两点的边,然后求欧拉路径。
#include <stdio.h>#include <cstring>int map[10][10], e[102][2], d[10];int ans[102][2], cnt, s;bool vis[102];void dfs(int u){    for (int i = 0; i <= 6; ++i)    {        if (map[u][i])        {            --map[u][i];            --map[i][u];            dfs(i);            cnt++;            ans[cnt][0] = u;            ans[cnt][1] = i;        }    }}int main(){    int n;    int a, b;    scanf("%d", &n);    //包含头文件string.h时使用memset竟然WA~     memset(d, 0, sizeof(d));    memset(map, 0, sizeof(map));    memset(vis, false, sizeof(vis));    for (int i = 1; i <= n; ++i)    {        scanf("%d %d", &a, &b);        d[a]++; d[b]++;        map[a][b]++; map[b][a]++;        e[i][0] = a, e[i][1] = b;    }    cnt = 0;    for (int i = 0; i <= 6; ++i)        if (d[i]) s = i;    for (int i = 0; i <= 6; ++i)    {        if (d[i] & 1)        {            cnt++;            s = i;        }    }    if (cnt > 2)    {        printf("No solution\n");        return 0;    }    cnt = 0;    dfs(s);    if (cnt < n)    {        printf("No solution\n");        return 0;    }    for (int i = cnt; i >= 1; --i)    {        for (int j = 1; j <= n; ++j)        {            if (!vis[j] && e[j][0] == ans[i][0] && e[j][1] == ans[i][1])            {                printf("%d +\n", j);                vis[j] = true;                break;            }            else if (!vis[j] && e[j][0] == ans[i][1] && e[j][1] == ans[i][0])            {                printf("%d -\n", j);                vis[j] = true;                break;            }        }    }    return 0;}

原创粉丝点击