这个题做的时候很头疼啊,想了好久不太好做,减枝的技巧很多,自己也不太会用,学习的其他大佬的方法,还有待提高,减枝减不好,很容易错过最优解。所以需要注意一下
也是学习了一波这个题很值得思考和考虑的题
#include <iostream>
#include <cstdio>
#include <cstring>
#include <iomanip>
using namespace std;
const int maxn = 100 + 10;
char s[maxn];
int graph[30][30];
int vis[30];
int ans,number;
int rgb[10];
void dfs(int deep,int tmp[])
{
if(deep == number)
{
int max1 = 0;
for(int i = 0; i < number; i++)
{
for(int j = i + 1; j < number; j++)
{
if(graph[tmp[i]][tmp[j]])
{
max1 = max(max1,j - i);
}
}
}
if(ans > max1)
{
ans = max1;
for(int i = 0; i < number; i++)
{
rgb[i] = tmp[i];
}
}
return;
}
for(int i = 0; i < 26 ; i++)
{
if(vis[i])
{
int ok = 1;
for(int j = 0; j < deep; j++)//这里是进行一步判断是否要减枝,很关键的一步否则会超时
{
if(graph[i][tmp[j]])
{
//cout<<deep - j<<"**" <<endl;
if(deep - j > ans)
{
ok = 0;
break;
}
}
}
if(ok)
{
tmp[deep] = i;
vis[i] = 0;
dfs(deep + 1,tmp);
vis[i] = 1;
}
}
}
return;
}
int main()
{
while(scanf("%s",s)!= EOF && s[0] != '#')
{
int i = 0;
memset(graph,0,sizeof(graph));
memset(vis,0,sizeof(vis));
while(s[i] != '\0')
{
if(s[i] == ':')
{
int ss = s[i - 1] - 'A';
vis[ss] = 1;
i++;
while(s[i] != ';' && s[i] != '\0')//这个题对于题目的输出处理也有一点难度,用一个无向图的方法去存
{
graph[ss][s[i] - 'A'] = 1;
graph[s[i] - 'A'][ss] = 1;
vis[s[i] - 'A'] = 1;
i++;
}
}
else
i++;
}
number = 0;
for(i = 0; i < 26; i++)
{
if(vis[i])
number++;
}
ans = 999999;
int tmp[10];
dfs(0,tmp);
for(int i=0; i<number; i++)
printf("%c ",rgb[i]+'A');
printf("-> %d\n",ans);
}
return 0;
}