SGU101 Domino 尤拉迴路

2021-07-05 04:20:41 字數 1237 閱讀 3145

給定你n張骨牌,每張牌左右兩端有乙個數字,每張牌的左右兩端數字可以顛倒,找出一種擺放骨牌的順序,使得相鄰骨牌的兩端數字相同(最左邊骨牌的最左端和最右邊骨牌的最右端可以不管)。

最先想到把每個數字縮成點,然後發現這樣連邊都有問題,於是翻了翻各種題解,大概是這樣的:把每個骨牌縮成兩條邊,分別對應正反兩種情況,在數字之間連線,找出一種能夠遍歷所有骨牌的方案,然後就變成了一筆畫問題。正向遍歷骨牌的時候為+,反向遍歷骨牌的時候為-,不管是正向還是反向遍歷了這張骨牌,那麼就視為這張骨牌已經遍歷過了。

如樣例: 5

1 22 4

2 46 4

2 1這樣連邊:

如果有骨牌沒有被遍歷到,那麼無解。

這一題我還有一點沒有弄明白的地方,就是在儲存路徑的時候要先dfs下一條邊,再儲存當前遍歷到的邊。如果先儲存當前遍歷的邊,再dfs下一條邊,就wa了。

#include#includeusing namespace std;

inline int mabs(int x)

struct t

edge[250];

int head[250],cnt;

void add_edge(int u,int v,int id)

int ans[250],tot,du[250];

bool vis[205];

void dfs(int u) }}

int n,a,b,s = -1;

bool check()

if(count == 1||count > 2) return false;

if(count == 2) return true;

for(int i = 0; i <= 6; i++)

if(du[i] > 0)

return true;

}int main()

if(!check())

dfs(s);

for(int i = 1; i <= n; i++)

if(!vis[i])

for(int i = tot; i >= 1; i--)//

if(ans[i] > 0)

printf("%d +\n",ans[i]);

else

printf("%d -\n",-ans[i]);

}

SGU 101 Domino 尤拉路徑

n個多公尺諾骨牌,每個骨牌左右兩側分別有乙個0 6的整數 骨牌可以旋轉以調換其左右兩數 求一種把這些骨牌從左到右排列的方案,使得所有相鄰的兩數字相等 即左邊骨牌右側的數字等於右邊骨牌左側的數字 把數字當成點,骨牌當做邊。構成無向圖,求一發尤拉道路即可。無向圖求尤拉路徑還是很好寫的。尤拉路徑深入講解 ...

sgu 101 Domino 尤拉路徑 DFS

include include int n,e 11 11 num 11 t 0,flag struct nodec 101 d 101 void dfs int u,int num for int i 0 i 6 i if e u i 0 int main else if c i x d j y ...

sgu 101 Domino 解題報告及測試資料

101.domino time limit per test 0.25 sec.memory limit per test 4096 kb 題解 求多公尺諾骨牌按照一定方式放置能否使相鄰的位置數字相同。其實就是求無向圖的尤拉通路,dfs即可。但需要注意以下幾點 1 注意是否是連通圖。2 注意自環。3...