站外题求助 悬一关
  • 板块题目总版
  • 楼主caramel_qwq
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/8/22 17:16
  • 上次更新2023/10/27 14:08:54
查看原帖
站外题求助 悬一关
444195
caramel_qwq楼主2022/8/22 17:16

大意是输入一个数n,在1~n中插入运算符号,+、-和空格,如果是空格,那么就把两个数连起来,比如1+2+3 4就是1+2+34的意思,求出所有可能的结果为0的算式。 输入样例

7

输出样例

1+2-3+4-5-6+7
1+2-3-4+5+6-7
1-2 3+4+5+6+7
1-2 3-4 5+6 7
1-2+3+4-5+6-7
1-2-3-4-5+6+7
#include<bits/stdc++.h>
using namespace std;
int n;
int c[18];
map<string,bool> mp;
void dfs(int now){
	if(now==n+1){
		int t=1,last;
		for(int i=2;i<=n;i++){
			if(c[i]==1) t+=i,last=1;
			if(c[i]==2) t-=i,last=2;
			if(c[i]==3){
				int k=0;
				for(int j=i-1;j<=n;j++){
					if(c[j+1]==3) k=k*10+j;
					else{
						i=j;
						break;
					}
				}
				if(last==1) t+=k;
				else if(last==2) t-=k;
				else t=k;
			}
		}
		if(t==0){
			string x;
			for(int i=1;i<=n;i++){
				if(c[i]==1) x+='+';
				if(c[i]==2) x+='-';
				if(c[i]==3) x+=' ';
				x+=char(i+'0'); 
			}
			if(mp[x]==0){
				for(int i=1;i<=n;i++){
					if(c[i]==1) printf("+");
					if(c[i]==2) printf("-");
					if(c[i]==3) printf(" ");
					printf("%d",i); 
				}
				printf("\n");
				mp[x]=1;		
			}
		}
		return ;
	}
	c[now+1]=1;
	dfs(now+1);
	c[now+1]=2;
	dfs(now+1);
	c[now+1]=3;
	dfs(now+1);
	return ;
}
int main(){
	scanf("%d",&n);
	dfs(1);
	return 0;
}
2022/8/22 17:16
加载中...