题意:输出一个长度为n的由小写字母并且长度大于4的单词不能相同的字符串
解题分析:首先能确定字符串的长度最大 26^4 + 3 (初始态的三个字符)。建立图的模型,将三个字符看成一个结点,每个结点有26条出边,得到26个新结点,这样就构成了有26^3 个结点,边有26^4 条边。现在只要将每条边遍历一遍就可以了,这就是欧拉路径,在这里是一个回路,即欧拉回路。注意,我们是从aaa出发的,为了遍历所有的状态,要把a字符的优先级设置为最低。下面提供手写栈和递归扩栈的代码,建议用手写栈。
代码如下:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<math.h>
#include<cstring>
#include<string>
const int DIG = 26;
const int N = DIG*DIG*DIG;
#define inf 0x3f3f3f
#define pi acos(-1.0)
#define eps 10e-6
using namespace std;
char ans[N*DIG+100];
bool vis[N][30];
int cnt[N];
int tot ;
int get_next(int cur,int i)
{
return cur%(DIG*DIG)*DIG + i;
}
void init()
{
tot = 0;
memset(cnt,0,sizeof(cnt));
memset(vis,0,sizeof(vis));
int i;
for(i = 0; i < 3; i++)
ans[tot++] = 'a';
int cur = 0;
while(1)
{
int iv = 0;
for(i = 1; i < 26; i++)
if(!vis[cur][i])
{
iv = i;
break;
}
int temp = get_next(cur,iv);
if(cnt[temp] == 26) break;
vis[cur][iv] = 1;
cnt[temp]++;
ans[tot++] = (char)(iv+'a');
cur = temp;
}
}
int main()
{
init();
int n;
while(scanf("%d",&n) != EOF)
{
if(n > tot) {printf("Impossible\n");continue;}
for(int i = 0; i < n; i++)
printf("%c",ans[i]);
printf("\n");
}
return 0;
}
#pragma comment (linker,"/STACK:102400000,102400000")
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<math.h>
#include<cstring>
#include<string>
const int DIG = 26;
const int N = DIG*DIG*DIG;
#define inf 0x3f3f3f
#define pi acos(-1.0)
#define eps 10e-6
using namespace std;
char ans[N*DIG+100];
bool vis[N][30];
int tot ;
int get_next(int cur,int i)
{
return cur%(DIG*DIG)*DIG + i;
}
void dfs(int cur)
{
int i;
for(i = 1; i < DIG; i++)
{
if(!vis[cur][i])
{
int temp = get_next(cur,i);
vis[cur][i] = 1;
ans[tot++] = (char)(i+'a');
dfs(temp);
}
}
if(!vis[cur][0])
{
int temp = get_next(cur,0);
vis[cur][0] = 1;
ans[tot++] = 'a';
dfs(temp);
}
}
int main()
{
int i;
tot = 0;
memset(vis,0,sizeof(vis));
for(i = 0; i < 3; i++)
ans[tot++] = 'a';
dfs(0);
// cout<<tot<<endl;
ans[tot] = '\0';
int n;
while(scanf("%d",&n) != EOF)
{
if(n > tot) {printf("Impossible\n");continue;}
printf("%s\n", (ans + 456979 - n));
}
return 0;
}