(细节处理)(枚举)洛谷P1473 零的数列 Zero Sum

本文介绍了如何解决洛谷P1473问题,通过枚举所有运算符组合并验证结果是否为零,重点在于处理细节,特别是空格的处理。算法分析和完整代码附带注释。

一、算法分析

刚开始打算用搜索,在dfs函数中记录每次累加的值,然后看到数据规模相当小,于是就直接写了一个dfs爆搜所有的运算符可能,然后再验证,这个验证过程是比较麻烦的,涉及一些细节问题。尤其是对于空格的处理。具体解释在代码里。

二、代码及注释

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
const int maxn=15;
char d[maxn];                     //标记路径 
const char chs[]={' ','+','-'};
void dfs(int cur){
	if(cur==n){
		//for(int i=1;i<=n-1;i++) cout<<d[i];
		//cout<<endl;
		char ch='+';                  //这里先置为'+',因为可以认为任何一个表达式的开头都存在一个加号 
		int sum=0;                    //暂存运算符 
		int cnt=1;                    //暂存一下连着的数字 
		for(int i=1;i<=n-1;i++){      //挨个验证 
			if(d[i]!=' '){              //基本思路就是在每次碰到非空格的时候,把之前记录下来的数算到sum里,然后更新ch和cnt,如果碰到的是空格,就更新cnt
				if(ch=='+') sum+=cnt;
				if(ch=='-') sum-=cnt;
				cnt=i+1;
				ch=d[i];
			}
			else{
				cnt=cnt*10+i+1;           //如果有空格,已有的先乘以10,再加空格后的 
			}
		}
		if(ch=='+') sum+=cnt;         //最后处理一下末尾 
		if(ch=='-') sum-=cnt;
		if(sum==0){
			printf("1");
			for(int i=1;i<=n-1;i++) printf("%c%d",d[i],i+1);
			printf("\n");
		}
		return;
	}
	for(int i=0;i<3;i++){
		d[cur]=chs[i];
		dfs(cur+1);
	}
}
int main(){

	scanf("%d",&n);
	
	dfs(1);
	
  return 0;	  
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值