蓝桥杯:特殊回文数(带限制的全排列)递归解法

蓝桥杯:特殊回文数(带限制的全排列)递归解法

问题描述

123321是一个非常特殊的数,它从左边读和从右边读是一样的。
  输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。

输入格式

输入一行,包含一个正整数n。

输出格式

按从小到大的顺序输出满足条件的整数,每个整数占一行。

样例输入

52

样例输出

899998

989989

998899

数据规模和约定

1<=n<=54。

思路

  • 回文数本质是带限制的全排列问题,题目在此基础上再加限制而已
  • 5位/6位回文数,只需要求解前3位就可以,故直接递归(dfs)暴力解,时间不会用太久,故不用考虑剪枝,直接穷举所有结果

代码

#include <iostream>

using namespace std;

int n;
int a[10];

int sum_5()
{
	int sum = 0;
	for(int i=0; i<3; i++)
	{
		sum += a[i];
	}
	for(int i=1; i>=0; i--)
	{
		sum += a[i];
	}
	return sum;
}
int sum_6()
{
	int sum = 0;
	for(int i=0; i<3; i++)
	{
		sum += a[i];
	}
	for(int i=2; i>=0; i--)
	{
		sum += a[i];
	}
	return sum;
}

void dfs_5(int len)
{
	if(len == 3)
	{
		if(sum_5() == n)
		{
			for(int i=0; i<3; i++)
			{
				cout<<a[i];
			}
			for(int i=1; i>=0; i--)
			{
				cout<<a[i];
			}
			cout<<endl;	
		}			
	}
	else
	{
		if(len > 0)
		{
			for(int i=0; i<=9; i++)
			{
				a[len] = i;
				dfs_5(len+1);
			}	
		}
		else
		{
			for(int i=1; i<=9; i++)
			{
				a[len] = i;
				dfs_5(len+1);
			}	
		}
	}
}

void dfs_6(int len)
{
	if(len == 3)
	{
		if(sum_6() == n)
		{
			for(int i=0; i<3; i++)
			{
				cout<<a[i];
			}
			for(int i=2; i>=0; i--)
			{
				cout<<a[i];
			}
			cout<<endl;	
		}			
	}
	else
	{
		if(len > 0)
		{
			for(int i=0; i<=9; i++)
			{
				a[len] = i;
				dfs_6(len+1);
			}	
		}
		else
		{
			for(int i=1; i<=9; i++)
			{
				a[len] = i;
				dfs_6(len+1);
			}	
		}
	}
}

int main()
{
	cin>>n;
	dfs_5(0);
	dfs_6(0);
	
	return 0;
}
发布了38 篇原创文章 · 获赞 1 · 访问量 488

猜你喜欢

转载自blog.csdn.net/weixin_44176696/article/details/104051139
今日推荐