第五届全国ITAT的一道决赛试题-我的解法

2、产生无连续重复部分的字符串。(60分) (1)描述:编写程序,产生由1,2,3这3个数字符号所构成、长度为n的字符串,并且在字符串中对于任何一个子串而言,都不会有相邻的、完全相同的子串; (2)输入:字符串长度n;
(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();
}  


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值