sgu 101 Domino 欧拉路径+DFS

#include <stdio.h>
#include <string.h>
int n,e[11][11],num[11],t=0,flag;
struct node{
    int x,y;
}c[101],d[101];
void dfs(int u,int num)
{
        if(num==n)
        {
            flag=1;
            return;
        }
        for(int i=0;i<=6;i++)
            if(e[u][i]!=0)
            {
                e[u][i]--;e[i][u]--;
                c[num].x=u;c[num].y=i;
                dfs(i,num+1);
                if(flag==1)
                    return;
                e[u][i]++;e[i][u]++;
            }
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        int i,j,k,a,b;
        memset(num,0,sizeof(num));
        memset(e,0,sizeof(e));
        for(i=0;i<n;i++)
        {
            scanf("%d%d",&a,&b);
            e[a][b]++;e[b][a]++;//生成边,因为是无向边,两个方向都可以
            num[a]++;num[b]++;
            d[i].x=a;d[i].y=b;//d[i]用于记录入度
        }
        int tt=0,t=0;
        for(i=0;i<=6;i++)
            if(num[i]%2==1)
            {
                t++;
                tt=i;
            }
        if(t==0)
            for(i=0;i<=6;i++)
            if(num[i]!=0)
            {
                tt=i;
                break;
            }
        //printf("%d\n",tt);
        if(t>2)
            printf("No solution\n");
        else
        {
            flag=0;//标记是否已经找到
            dfs(tt,0);
            if(flag==0)
                printf("No solution\n");
            else
            {
                int s[101];
                memset(s,0,sizeof(s));
               // for(i=0;i<t;i++)
                 //  printf("%d %d\n",c[i].x,c[i].y);
                for(i=0;i<n;i++)
                    for(j=0;j<n;j++)//遍历出的路径,比较原来牌得位置和正负面,输出相应值
                    {
                        if(s[j]==1)//s[j]标记牌是否已经用过
                            continue;
                        if(c[i].x==d[j].x&&c[i].y==d[j].y)
                        {
                            printf("%d +\n",j+1);
                            s[j]=1;
                            break;
                        }
                        else if(c[i].x==d[j].y&&c[i].y==d[j].x)
                        {
                            printf("%d -\n",j+1);
                            s[j]=1;
                            break;
                        }
                    }
            }
        }
    }
    return 0;
}
/*
题意:
翻转几个牌(牌有正反面),使得从一个牌出发,遍历所有牌,其中前一张牌得反面等于后一张牌得正面,其实就是一个欧拉路径

欧拉路径:连通的无向图  有欧拉路径的充要条件是:中奇顶点(连接的边数量为奇数的顶点)的数目等于0或者2。

方法:以奇数入度点(无向图中的意思就是连接边数)为起点,遍历,能走完所有边得就成功,输出路径,用DFS就可以了
*/

你可能感兴趣的:(DFS,欧拉路径)