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就可以了*/