标签:
此题为小白书暴力求解法的训练参考
翻译请戳 http://luckycat.kshs.kh.edu.tw/
解题思路
回溯。可以先排序后搜索。
代码
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<algorithm> using namespace std; #define MAX_LEN 200 char P[MAX_LEN], A[MAX_LEN]; char Final[MAX_LEN]; bool used[MAX_LEN]; bool G[MAX_LEN][MAX_LEN]; int n, minval; bool ex(char cha) { for(int i=0; i<n; i++) if(P[i]==cha) return true; return false; } void Read() { char c; c = getchar(); while(c != ‘\n‘) { if(!ex(c)) P[n++] = c; getchar(); char root = c; while((c=getchar()) != ‘;‘&&c!=‘\n‘) { if(c == ‘ ‘) continue; else { if(!ex(c)) P[n++] = c; G[root][c] = true; G[c][root] = true; } } if(c!=‘\n‘) c = getchar(); } } int CalWid(int dex) { int value = 0; for(int i=0; i<dex-1; i++) { for(int j=i+1; j<dex; j++) if(G[A[i]][A[j]]) { if(abs(i-j)>value) value = abs(i-j); } } return value; } void Search(int cur) { if(CalWid(cur) >= minval) return ; if(cur == n) { int wid=CalWid(cur); if(wid<minval) minval=wid; for(int i=0; i<cur; i++) Final[i] = A[i]; return ; } for(int i=0; i<n; i++) if(!used[P[i]]) { A[cur] = P[i]; used[P[i]] = true; Search(cur+1); used[P[i]] = false; } } int main() { char ch; ch = getchar(); while(ch != ‘#‘) { ungetc(ch, stdin); memset(used, 0, sizeof(used)); memset(G, 0, sizeof(G)); minval = 1000; n = 0; Read(); sort(P, P+strlen(P)); Search(0); for(int i=0; i<n; i++) printf("%c ", Final[i]); printf("-> %d\n", minval); ch = getchar(); } return 0; }
标签:
原文地址:http://www.cnblogs.com/ZengWangli/p/5766233.html