资讯详情

XDOJ 172. 构造表达式【DFS/模拟】

综合

1S

100Kb

给定一个表示序列长度的整数 n n n ( 3 ≤ n ≤ 9 3\le n\le 9 3≤n≤9)。在序列 1 2 3 … n 1\ 2\ 3\dots n 123…n 中插入 ' ''-'' ' 结构表达式,插入 ' ' 例如,前后两个数字构成一个整数 1 2-3-4-5 = 0

在输出结构的所有表达式中,结果是 0 0 0 例如,表达式的数量, n = 3 n=3 n=3 只有表达式 1 2-3=0 ,输出结果为 1 1 1 。

输入数据是一个整数 n n n ( n < 10 n<10 n<10),表示序列长度,同时表示输入序列为 1 2 3 … n 1\ 2\ 3\dots n 123… n 。

对于每一组数据,输出一个整数,表示构造的表达式中结果为 0 0 0 的表达式数量。

3

1

解法 DFS+模拟

经典类型的DFS题目:

#include <bits/stdc++.h>
using namespace std;
int n, cnt = 0; // count计数结果为0的所有表达式
int a[9] = { 
        1, 2, 3, 4, 5, 6, 7, 8, 9};
/* idx 0 1 2 3 4 5 6 7 8 ** a 1 2 3 4 5 6 7 8 9 ** b 1 b[1] b[2] b[3] b[4] b[5] b[6] b[7] b[8] ** b = ops */
int ops[10] = { 
        0}; // 记录命令 b[i]记录i+1和i+2之间空格的命令,即a[i-1]和a[i]之间空格的命令
void dfs(int space, int op) { 
         	// space记录在哪一空格之间插入命令
	ops[space] = op; 			// 记录每个空格中的命令选择
	if (space == n - 1) { 
         		// 例如,4个数字1 2 3 4,最多有3个格子
		int sum = 0; 			// 记录表达式的最终结果
		for (int j = 0; j <= space; ) { 
           // j遍历命令数组ops[]
			int tmp = a[j], op = ops[j++];  // op记录此处的命令
			for (; ops[j] == 3; ++j) tmp = tmp * 10 + a[j];
			if (op == 1) sum += tmp;      // 加法,表示a[...:i-1]前面的数加上a[j:...]的数
			else if (op == 2) sum -= tmp; // 减法,表示a[...:i-1]前面的数减去a[j:...]的数
		}
// cout << sum << endl;
		if (sum == 0) ++cnt;
		return;
	}
	for (int i = 1; i <= 3; ++i) dfs(space + 1, i); // 命令1: +, 2: -, 3: ' '
}
int main() { 
        
	cin >> n;
	dfs(0, 1); // b[0]命令为1,即加法
	cout << cnt;
	return 0;	
}

在这里插入图片描述

标签: 传感器lr18xbn08lum

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台