【题】每日一题

一.零的数列

描述

  • 请考虑一个由 1 到 N 的数字组成的递增数列:1,2,3,...,N。
  • 现在请在数列中插入 + 表示加,或者 - 表示减, (空格) 表示空白(例如 1-2 3 就等于 1-23),来将每一对数字组合在一起(请不要在第一个数字前插入符号)。
  • 计算该表达式的结果并判断其值是否为 0。 请你写一个程序找出所有产生和为零的长度为N的数列。

样例

思路

  • 观察到输入一个数字N时,得到的数列有7个数字6个符号(可使用char数组存储符号),且数字递增。每一组数据的整数不变,变的只有符号,因此返回时可以使用string类型
  • 考虑极端情况下,每个符号都是空格(" "),则有输出:1 2 3 4 5 6 7,于是返回的sum是1234567,注意到12 = 1+2*10,123 = 12+3*10,于是可用深度优先遍历解决。
  • dfs传入的参数需要有:int整数(从1开始递增),该条件下的number,符号,sum值
  • 递归出口:当int整数为N,如果sum==0,使用string类型输出结果

代码

cpp 复制代码
using namespace std;
char op[10];
int N;
void dfs(int pos, int num, int sign, int sum)
{
	if (pos == N)
	{
		sum += num * sign;
		if (sum == 0)
		{
			string s = "1";
			for (int i = 1; i < N; i++)
			{
				s += op[i];
				s += to_string(i+1);
			}
			cout << s << endl;
		}
		return;
	}
	//空格
	op[pos] = ' ';
	dfs(pos + 1, num * 10 + (pos + 1), sign, sum);
	//加号
	op[pos] = '+';
	dfs(pos + 1, pos + 1, 1, sum + num * sign);
	//减号
	op[pos] = '-';
	dfs(pos + 1, pos + 1, -1, sum + num * sign);
}
int main()
{
	cin >> N;
	dfs(1, 1, 1, 0);
}

注意:空格递归时传入的sign,一层递归结束时保留原有的sign


相关推荐
Dovis(誓平步青云)2 分钟前
总用电下降了,为什么家庭能源看板仍然提示异常
java·开发语言·数据库·人工智能·算法·电脑·能源
开开心心就好6 分钟前
A3的PDF怎么切成A4?拖一下分割线就行
服务器·开发语言·python·算法·pdf·ocr·tornado
闻缺陷则喜何志丹31 分钟前
详细设计说明书的内容要求
算法·测试·存储
和裕36 分钟前
定制纸箱刀卡、平卡、隔档分别是什么?结构与适用场景区别全解析
大数据·运维·网络·人工智能·算法
Tisfy1 小时前
LeetCode 3723.数位平方和的最大值:构造
数学·算法·leetcode·字符串·题解
hetao17338371 小时前
联盟场-提高组-R4 & ZYZSC-S-Round 7
c++·算法
碧海银沙音频科技研究院1 小时前
基于炬芯ATS3089X音箱的音乐播放歌词显示功能实现
人工智能·驱动开发·嵌入式硬件·算法
知识分享小能手1 小时前
C学习教程,从入门到精通,C语言数组 —— 知识点详解(8)
c语言·学习·算法
hetao17338372 小时前
联盟场-提高组-R2 & ZYZSC-S-Round 5
c++·算法
其实防守也摸鱼2 小时前
Codex 下载与本地部署实战指南
linux·服务器·前端·数据库·算法·ai