2、产生无连续重复部分的字符串。(60分)
(1)描述:编写程序,产生由1,2,3这3个数字符号所构成、长度为n的字符串,并且在字符串中对于任何一个子串而言,都不会有相邻的、完全相同的子串;
(2)输入:字符串长度n;
(3)输出:无相邻重复子串的所有字符串,每个字符串换行输出。
例如:
Please input string length n: 5 (回车)
屏幕输出:
13121
13123
13212
(3)输出:无相邻重复子串的所有字符串,每个字符串换行输出。
例如:
Please input string length n: 5 (回车)
屏幕输出:
13121
13123
13212
……
方法是构造一棵树,比如1,他的左节点是2,右节点是三,然后只要把这棵树按照要求打印出来就行
#include <iostream>
struct node
{
int data;
int level;
node* parent;
node* left;
node* right;
};
void printPath( node* current)
{
if( current == 0 )
{
return ;
}
printPath( current->parent ) ;
std::cout << current->data;
}
//判断新添加的节点会不会出现重复的子字符串
bool isChildDataValid( node* current, int data, int parentData)
{
if( current != 0 && current->parent != 0 )
{
if( current->data == data && current->parent->data == parentData )
{
return false;
}
else
{
return isChildDataValid( current->parent, data, parentData );
}
}
return true;
}
node* createTree( int num, int level, node* parent, int MaxLevel )
{
node* current = new node();
current->data = num;
current->level = level;
current->parent = parent;
if( level < MaxLevel )
{
int leftData = (num + 0) % 3 + 1;
if( isChildDataValid( current, leftData, num ) )
{
current->left = createTree( leftData, level + 1, current, MaxLevel );
}
int rightData = (num + 1) % 3 + 1;
if( isChildDataValid( current, rightData, num ) )
{
current->right = createTree( rightData, level + 1,current, MaxLevel );
}
}
current->left = 0;
current->right = 0;
if( level >= MaxLevel )
{
printPath( current );
std::cout << std::endl;
}
return current;
}
int main()
{
for( int i = 1; i < 4; i++ )
{
node* tree = createTree( i, 1, 0, 5 );
}
getchar();
}