SGU 101 Domino【欧拉】

给你一些骨牌。。看能不能一笔走完~赤裸裸的欧拉~

 

代码:

SGU101
 1 #include<cstdio>
 2 #include<cstring>
 3 
 4 const int maxn=110;
 5 
 6 struct Edge{
 7     int to,next;
 8 };
 9 Edge edge[maxn],tol[maxn];
10 int Map[10][10];
11 int etot;
12 int exist[10];
13 
14 void Eular_dfs(int idx){
15     for(int i=0;i<7;i++){
16         if(Map[idx][i]){
17             Map[idx][i]--,Map[i][idx]--;
18             Eular_dfs(i);
19             edge[++etot].to=idx,edge[etot].next=i;//相当于一个堆栈 
20         }
21     }
22 }
23 
24 int main(){
25     int n,i,tot=0,u,v;
26     scanf("%d",&n);
27     for(i=1,etot=0;i<=n;i++){
28         scanf("%d%d",&u,&v);
29         exist[u]++,exist[v]++;
30         Map[u][v]++,Map[v][u]++;
31         tol[i].to=u,tol[i].next=v;
32     }
33     int odd=0,st=0;
34     for(i=0;i<7;i++){
35         if(exist[i]&1) odd++,st=i;
36         else if(exist[i]&&!st) st=i;
37     }
38     if(odd && odd!=2){puts("No solution");return 0;}/*
39     for(i=0;i<7;i++){//输出Map 
40         for(v=0;v<7;v++) printf("%d ",Map[i][v]);
41         puts("");
42     }*/
43     Eular_dfs(st);
44     if(etot<n){puts("No solution");return 0;}//不能一笔走完 
45     for(i=etot;i>=0;i--)//输出的时候暴力~ 
46         for(v=1;v<=n;v++){
47             if(edge[i].to==tol[v].to && edge[i].next==tol[v].next){
48                 printf("%d +\n",v),tol[v].to=-1;
49                 break;
50             }else if(edge[i].next==tol[v].to && edge[i].to==tol[v].next){
51                 printf("%d -\n",v),tol[v].to=-1;
52                 break;
53             }
54         }
55     return 0;
56 }

 

posted @ 2012-10-02 09:33  舞步い嫣语逝爱醉灵魂  阅读(262)  评论(0)    收藏  举报