1. 程式人生 > >#深搜#洛谷 1341 無序字母對

#深搜#洛谷 1341 無序字母對

題目

找到一個n+1的字典序最小的字串且相鄰兩個字母在字母對中(字母可以相反)


分析

首先先找奇點,再找偶點,然後深搜判斷是否可行


程式碼

#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; }