#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就可以了
*/
sgu 101 Domino 欧拉路径+DFS
最新推荐文章于 2021-11-20 16:12:17 发布