给一些骨牌,骨牌两端有数,让你把骨牌连起来,相邻的数要一样,骨牌可以翻转
每个骨牌相当于一个边,骨牌可以翻转就是说是无向图,求一个欧拉路即可,输出任意可行解
求欧拉路的方法就是dfs一遍,回溯时输出,然后输出的倒序即为一个可行解
#include <cstdio>
#include <cstring>
struct Node {
int fe;
};
struct Edge {
int t,ne;
bool visited;
};
Node a[7];
Edge b[210];
int deg[7];
int n,p;
bool hasans=true;
int ans[110];
void dfs(int i) {
for (int j=a[i].fe;j!=0;j=b[j].ne) {
if (b[j].visited==false) {
b[j].visited=b[j^1].visited=true;
dfs(b[j].t);
ans[p++]=j;
}
}
}
void putedge(int x,int y) {
b[p].t=y;
b[p].ne=a[x].fe;
a[x].fe=p;
p++;
}
int main() {
int x,y,i,odd=0,start;
scanf("%d",&n);
p=2;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(deg,0,sizeof(deg));
for (i=0;i<n;i++) {
scanf("%d%d",&x,&y);
putedge(x,y);
putedge(y,x);
deg[x]++;
deg[y]++;
}
p=0;
for (i=0;i<7;i++) if (deg[i]%2!=0) odd++;
if (odd==0) {
for (i=0;i<7;i++) if (deg[i]>0) start=i;
dfs(start);
for (i=n*2+1;i>1;i--) if (b[i].visited==false) hasans=false;
} else if (odd==2) {
for (i=0;i<7;i++) if (deg[i]%2>0) start=i;
dfs(start);
for (i=n*2+1;i>1;i--) if (b[i].visited==false) hasans=false;
} else {
hasans=false;
}
if (hasans) {
for (i=0;i<n;i++) {
printf("%d %c\n",ans[i]/2,ans[i]%2?'+':'-');
}
} else {
printf("No solution\n");
}
return 0;
}