给定n张骨牌,每张骨牌有左右两个点数(从1到6)。问能不能通过调整交换骨牌的顺序和交换左右的
2点数,使得任意两个相邻的骨牌的相邻段为相等的数字。
构造一个图,图的顶点是6个点数,每张牌对应一条无向边,这条边的两个顶点就是排的点数。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#define VNUM 6
#define MAXN 101
struct EdgeNode
{
int adjvex;
int EdgeNo;
int flag;
EdgeNode * nextedge;
};
struct EdgeNode * EdgeLink[VNUM+1];
int visted[MAXN];
int path[MAXN];
int pi;
int N;
void CreateLG()
{
int i;
struct EdgeNode *p1,*p2;
int v1,v2;
memset(visted,0,sizeof(visted));
for(i=1;i<=6;i++)
EdgeLink[i]=NULL;
int number=1;
for(i=1;i<=N;i++)
{
scanf("%d%d",&v1,&v2);
p1=new EdgeNode;
p2=new EdgeNode;
p1->adjvex=v2;
p1->EdgeNo=number;
p1->flag=1;
p1->nextedge=EdgeLink[v1];
EdgeLink[v1]=p1;
p2->adjvex=v1;
p2->EdgeNo=number;
p2->flag=-1;
p2->nextedge=EdgeLink[v2];
EdgeLink[v2]=p2;
number++;
}
}
void DFSL(int start)
{
while(pi<=N)
{
struct EdgeNode *p;
p=EdgeLink[start];
while(p!=NULL)
{
if(!visted[p->EdgeNo])
{
visted[p->EdgeNo]=1;
if(p->flag>0)
path[pi]=p->EdgeNo;
else
path[pi]=-(p->EdgeNo);
pi++;
DFSL(p->adjvex);
}
else p=p->nextedge;
}
}
}
void Domino()
{
int JDNum=0;
int DNum=0;
int start1,start2;
struct EdgeNode *p;
int i;
for(i=1;i<=6;i++)
{
p=EdgeLink[i];
while(p!=NULL)
{
DNum++;
p=p->nextedge;
}
if(DNum%2!=0)
{
start1=i;
JDNum++;
}
if(DNum!=0)
start2=i;
printf("%d\n",DNum);
DNum=0;
}
if(DNum!=0 && JDNum!=2)
{
printf("No solution\n");
return;
}
pi=1;
if(JDNum==2)
DFSL(start1);
else
DFSL(start2);
char flag1='+',flag2='-';
for(i=1;i<=N;i++)
{
if(path[i]>0)
printf("%d%c\n",path[i],flag1);
else
printf("%d%c\n",-path[i],flag2);
}
}
void DeleteLG()
{
int i;
struct EdgeNode *p;
for(i=1;i<=6;i++)
{
p=EdgeLink[i];
while(p!=NULL)
{
EdgeLink[i]=p->nextedge;
delete p;
p=EdgeLink[i];
}
}
}
int main()
{
while(scanf("%d",&N)&&N!=0)
{
CreateLG();
Domino();
DeleteLG();
}
return 0;
}