sgu 101 Domino 欧拉路径+DFS

来源:互联网 发布:象棋记谱软件 编辑:程序博客网 时间:2024/04/30 17:33
#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就可以了*/

原创粉丝点击