1027wedding.txt

来自「厦门大学ACM题库中的1027婚礼问题」· 文本 代码 · 共 187 行

TXT
187
字号
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define MAXV 30
//边结点结构类型
typedef struct ANode{
	int sexnum;//该边的亲密人
	struct ANode* nextarc;
}ArcNode;
//邻接表头结点类型
typedef struct VNode{
	ArcNode *firstarc;
}VNode;
typedef VNode AdjList[MAXV];
typedef struct{
	AdjList adjlist;//邻接表
}AGraph;
AGraph* Husband,*Wife;
int Brideline[MAXV];
int Groomline[MAXV];
int mark;   
int flag; 
int tag; 
//2h以20形式存入,2w以21形式存入
void Back_Bride(int i,int n)
{
    int j,a;  
	ArcNode* p;
	tag=1;
    if(mark!=1 && flag!=1)   
    {   
        if(i==n)   
        {   
            flag=1;   
            for(j=1;j<n;j++)   
            {   
				a=Brideline[j]%10;
				if(a==0)printf("%dh ",j);
				else printf("%dw ",j); 
            }  
			//printf("\n");
            return;   
        } 
        if(Husband->adjlist[i].firstarc!=NULL)
		{
			j=1; 
			while(j<=i-1)
			{
				for(p=Husband->adjlist[i].firstarc;p!=NULL;p=p->nextarc)
				{
					if(p->sexnum==Groomline[j])
					{
		     			tag=0;break;//tag用来标记前面i-1人中与第i个人有亲密关系的,有则不可放
					}
					
				}
				if(!tag)break;
				else j++;
			}
		}
		if(tag)//如果可以放的话
		{
			Groomline[i]=i*10;//放i号husband
			Brideline[i]=i*10+1;//放i号wife
			Back_Bride(i+1,n);//回溯
		}
		if(!tag && !mark)//Groomline[i]不可以放i号husband时,看放i号wife行不行
		{
			tag=1;//恢复tag=1;
			if(Wife->adjlist[i].firstarc!=NULL)//需要作判断时
			{
				j=1; 
				while(j<=i-1)
				{
					for(p=Wife->adjlist[i].firstarc;p!=NULL;p=p->nextarc)
					{
						if(p->sexnum==Groomline[j])
							tag=0;
						break;
					}
					
					if(!tag)break;
					else j++;
				}
			}
			if(tag)//如果放第i号wife可以的话
			{
				Groomline[i]=i*10+1;
				Brideline[i]=i*10;
				Back_Bride(i+1,n);
			}
			else{//如果放第i号wife不可以的话
				mark=1;   
				printf("bad luck\n");   
				return;   
			}
		}
		else 
			return;
	}
}	
int main()
{
	int n,m,i,j,c,num,a,tum;
		ArcNode* p;
		int first=1;
		char string1[2],string2[2];
		scanf("%d%d",&n,&m);
	while(first==1)
	{
		    flag=0;
		    mark=0;
			Husband=(AGraph*)malloc(sizeof(AGraph));
			Wife=(AGraph*)malloc(sizeof(AGraph));
			for(i=1;i<n;i++)
			{
				Husband->adjlist[i].firstarc=NULL;
				Wife->adjlist[i].firstarc=NULL;
				Brideline[i]=0;
				Groomline[i]=0;
			}
			for(j=1;j<=m;j++)
			{
				scanf("%s%s",string1,string2);
				a=string1[0]-'0';
				if(string1[1]=='h')
				{
					c=string2[0]-'0';
					if(string2[1]=='h')
					{
						num=c*10;
						tum=a*10;	
						p=(ArcNode*)malloc(sizeof(ArcNode));
						p->sexnum=tum;
						p->nextarc=Husband->adjlist[c].firstarc;
						Husband->adjlist[c].firstarc=p;	
					}
					else//string2[1]=='w'
					{	
						num=c*10+1;
						tum=a*10;
						p=(ArcNode*)malloc(sizeof(ArcNode));
						p->sexnum=tum;
						p->nextarc=Wife->adjlist[c].firstarc;
						Wife->adjlist[c].firstarc=p;
						
					}
					p=(ArcNode*)malloc(sizeof(ArcNode));
					p->sexnum=num;
					p->nextarc=Husband->adjlist[a].firstarc;
					Husband->adjlist[a].firstarc=p;	
				}
				else
				{
					
					c=string2[0]-'0';
					if(string2[1]=='h')
					{
						num=c*10;
						tum=a*10+1;	
						p=(ArcNode*)malloc(sizeof(ArcNode));
						p->sexnum=tum;
						p->nextarc=Husband->adjlist[c].firstarc;
						Husband->adjlist[c].firstarc=p;	
					}
					else//string2[1]=='w
					{
						num=c*10+1;
						tum=a*10+1;	
						p=(ArcNode*)malloc(sizeof(ArcNode));
						p->sexnum=tum;
						p->nextarc=Wife->adjlist[c].firstarc;
						Wife->adjlist[c].firstarc=p;	
					}
					p=(ArcNode*)malloc(sizeof(ArcNode));
					p->sexnum=num;
					p->nextarc=Wife->adjlist[a].firstarc;
					Wife->adjlist[a].firstarc=p;	
				}
			}
			Back_Bride(1,n);
			scanf("%d%d",&n,&m);
			if(m==0 && n==0)first=0;
	}	
			return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?