題目描述
給定n個各不相同的無序字母對(區分大小寫,無序即字母對中的兩個字母可以位置顛倒)。請構造乙個有n+1個字母的字串使得每個字母對都在這個字串中出現。
輸入輸出格式
輸入格式:
第一行輸入乙個正整數n。
以下n行每行兩個字母,表示這兩個字母需要相鄰。
輸出格式:
輸出滿足要求的字串。
如果沒有滿足要求的字串,請輸出「no solution」。
如果有多種方案,請輸出前面的字母的ascii編碼盡可能小的(字典序最小)的方案
輸入輸出樣例
輸入樣例#1:
4 az
tz xt
ax 輸出樣例#1:
xaztx
說明【資料規模與約定】
不同的無序字母對個數有限,n的規模可以通過計算得到。
先簡單說一下尤拉這個問題,尤拉通路即一筆畫問題,就是在不走重複邊的情況下走完全部的邊,如果能回到起點即是尤拉迴路
首先,看到題目,再看到樣例,就會發現字母對是[b ]必須[/b ]連在一起的,然後就會想到圖的遍歷之類的。有點靈感的話想到尤拉圖應該沒什麼問題。
然後建圖就很清晰了。將字母作為圖的頂點,如果兩字母間存在字母對就在相應的字母所對應的頂點連上一條五向邊。題目要求的是字典序最小的尤拉通路,怎麼辦呢?
如果有同學想用遞推來寫的話,可能會因為提前走進死路而wa,加點判斷的話,就我個人來說得了80,望神犇指導。
一點都不優美的**:
#include
#include
#include
#include
#include
using
namespace
std;
const
int maxn = 100;
intmap[maxn][maxn], cnt[maxn], vis[maxn][maxn];
int n, maxm = 53;
stack
ans;
int zhuanhua1(char c)
char zhuanhuan2(int x)
void euler(int u)
}int main()
int tot = 0, min1 = 1e8, min2 = 1e8;
for (int i = 0; i < maxm; i++)
else
if (cnt[i])
min2 = min(min2, i);
}if (tot != 0 && tot != 2)
printf("no solution\n");
else
printf("\n");
}return
0;}
無序字母對
問題描述 給定n個各不相同的無序字母對 區分大小寫,無序即字母對中的兩個字母可以位置顛倒 請構造乙個有n 1個字母的字串使得每個字母對都在這個字串中出現。輸入格式 第一行輸入乙個正整數n。以下n行每行兩個字母,表示這兩個字母需要相鄰。輸出格式 輸出滿足要求的字串。如果沒有滿足要求的字串,請輸出 no...
無序字母對
剛開始學尤拉迴路,因為不太理解導致 wa 了兩次。錯點 度數為奇數個的點數大於2時不存在尤拉路徑 是偶數個也不行 如果存在尤拉路徑而不是尤拉迴路時,不能隨便選乙個點當做起點,必須選度數為奇數的兩個點中的乙個。include include includeusing namespace std con...
無序字母對
傳送門 一道非常不錯的尤拉迴路 路徑 題 我們已經知道怎麼求尤拉迴路 路徑 了,但是如果求字典序最小的呢?求尤拉迴路是乙個深搜的過程 所以我們不如每次在向下乙個點深搜的時候,每次讓他先走那個字典序最小的節點,這樣我們就能保證字典序最小了。不過實際上這個用鄰接表實現會很麻煩。我的實現方法是,對於所有的...