題目
找到一個(gè)n+1的字典序最小的字符串且相鄰兩個(gè)字母在字母對(duì)中(字母可以相反)
分析
首先先找奇點(diǎn),再找偶點(diǎn),然后深搜判斷是否可行
代碼
#include <cstdio>
#include <algorithm>
#define rr register
using namespace std;
int n,dep[61],start,mp[61][61],flag; char pre[101];
void dfs(int x,int dep){
if (flag) return;
pre[dep]=(x>26)?(x+70):(x+64);
if (dep>n){flag=1; return;}
for (rr int i=1;i<=52;++i) if (mp[x][i])
--mp[x][i],--mp[i][x],dfs(i,dep+1),++mp[x][i],++mp[i][x];
}
signed main(){
scanf("%d",&n);
for (rr int i=1;i<=n;++i){
rr char tmp[2];
scanf("%s",tmp);
tmp[0]=(tmp[0]>=97)?(tmp[0]-70):(tmp[0]-64);
tmp[1]=(tmp[1]>=97)?(tmp[1]-70):(tmp[1]-64);
++mp[tmp[0]][tmp[1]],++mp[tmp[1]][tmp[0]],
++dep[tmp[0]],++dep[tmp[1]];
}
for (rr int i=1;i<=52&&!start;++i) start=i*(dep[i]&1);
if (!start) for (rr int i=1;i<=52&&!start;++i)
if (dep[i]) start=i; dfs(start,1);
if (flag) for (rr int i=1;i<n+2;++i) putchar(pre[i]);
else printf("No Solution");
return 0;
}
本站文章版權(quán)歸原作者及原出處所有 。內(nèi)容為作者個(gè)人觀點(diǎn), 并不代表本站贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé),本站只提供參考并不構(gòu)成任何投資及應(yīng)用建議。本站是一個(gè)個(gè)人學(xué)習(xí)交流的平臺(tái),網(wǎng)站上部分文章為轉(zhuǎn)載,并不用于任何商業(yè)目的,我們已經(jīng)盡可能的對(duì)作者和來(lái)源進(jìn)行了通告,但是能力有限或疏忽,造成漏登,請(qǐng)及時(shí)聯(lián)系我們,我們將根據(jù)著作權(quán)人的要求,立即更正或者刪除有關(guān)內(nèi)容。本站擁有對(duì)此聲明的最終解釋權(quán)。