【图】一笔画
一筆畫(huà)問(wèn)題(euler-circuit.cpp)
題目描述對(duì)給定的一個(gè)無(wú)向圖,判斷能否一筆畫(huà)出。若能,輸出一筆畫(huà)的先后順序,否則輸出“No Solution!”
所謂一筆畫(huà)出,即每條邊僅走一次,每個(gè)頂點(diǎn)可以多次經(jīng)過(guò)。
輸出字典序最小的一筆畫(huà)順序。
輸入
第1行:1個(gè)整數(shù)n,表示圖的頂點(diǎn)數(shù)(n<=100)
接下來(lái)n行,每行n個(gè)數(shù),表示圖的鄰接矩陣
輸出
第1行:一筆畫(huà)的先后順序,每個(gè)頂點(diǎn)之間用一個(gè)空格分開(kāi)
樣例輸入
樣例一
3
0 1 1?
1 0 1?
1 1 0?
樣例二:
7
0 1 0 1 1 0 1?
1 0 1 0 0 0 0?
0 1 0 1 0 0 0?
1 0 1 0 0 0 0?
1 0 0 0 0 1 0?
0 0 0 0 1 0 1?
1 0 0 0 0 1 0?
樣例輸出
樣例一:
1 2 3 1
樣例二:
1 2 3 4 1 5 6 7 1
#------------------------------------------------------------------------------#
此題說(shuō)難也不難,輸入的地方它已簡(jiǎn)化,直接存在鄰接矩陣即可。
注意要統(tǒng)計(jì)一下每個(gè)點(diǎn)的度(即看一下這個(gè)點(diǎn)是奇數(shù)點(diǎn)還是偶數(shù)點(diǎn))不懂一筆畫(huà)……點(diǎn)擊一下,如果奇數(shù)點(diǎn)大于2個(gè)肯定是不行的,直接“No Solution!”,否則就從其中一個(gè)出發(fā),沒(méi)有的話就從偶數(shù)點(diǎn)開(kāi)始,注意要字典序最小。
遞歸就一個(gè)參數(shù)——當(dāng)前到哪個(gè)點(diǎn)了,然后從1循環(huán)到當(dāng)前,如果可以到就進(jìn)入,注意此時(shí)要將此路封閉,出來(lái)時(shí)存一下就可以了。
代碼:
#include<cstdio> int a[105][105],ans[10005],p; int n,f,b=1,al; void m(int x) {for(int i=1;i<=n;i++)if(a[x][i]==1){a[x][i]=0;a[i][x]=0;//x點(diǎn)到i點(diǎn)和i點(diǎn)到x點(diǎn)都要清0,以免重復(fù)遞歸m(i);}ans[++al]=x;//記錄路徑 } int main() {freopen("euler-circuit.in","r",stdin);freopen("euler-circuit.out","w",stdout);scanf("%d",&n);for(int i=1;i<=n;i++){p=0;//存當(dāng)前點(diǎn)的度f(wàn)or(int j=1;j<=n;j++){scanf("%d",&a[i][j]);if(a[i][j]==1)p++;//如果有聯(lián)通,度++}if(p%2==1)//度為奇數(shù)(奇數(shù)點(diǎn)){if(f==0)//f用來(lái)看是否為第一個(gè)奇數(shù)點(diǎn),順便統(tǒng)計(jì)有多少個(gè)奇數(shù)點(diǎn)b=i;//b是存開(kāi)始點(diǎn)f++;}}if(f>2)//奇數(shù)點(diǎn)大于2便一定無(wú)法完成{printf("No Solution!");return 0;}m(b);//開(kāi)始遞歸printf("%d",ans[al]);for(int i=al-1;i>=1;i--)printf(" %d",ans[i]);return 0; }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?By WZY
轉(zhuǎn)載于:https://www.cnblogs.com/LinqiongTaoist/p/7203761.html
總結(jié)
- 上一篇: apache 配置rewrite模块,U
- 下一篇: vs2015安装与单元测试以及经过优化的