原题链接
题目大意
在
1
∼
n
1\sim n
1∼n各个数字中间放
“
+
”
“+”
“+”或
“
−
”
“-”
“−”或不放符号组成一个算式,求得数为
0
0
0的方案
S
a
m
p
l
e
\mathbf{Sample}
Sample
I
n
p
u
t
\mathbf{Input}
Input
7
S a m p l e \mathbf{Sample} Sample O u t p u t \mathbf{Output} Output
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
解题思路
d
f
s
dfs
dfs所有的符号可能,然后再通过判断得数是否为
0
0
0就可以了
注意这里的优先顺序是不放符号
>
“
+
”
>
“
−
”
>“+”>“-”
>“+”>“−”
即使当前没有符号也要输出一个空格
上代码
#include<iostream>
using namespace std;
int n;
char op[10];
bool pd()
{
int sum=0,num=1;
char oper='+';
for(int i=1; i<n; i++)
{
if(op[i]==' ')
num=num*10+(i+1);
else
{
if(oper=='+') sum+=num;
else sum-=num;
oper=op[i];
num=(i+1);
}
// cout<<op[i]<<" "<<sum<<" "<<num<<endl;
}
if(oper=='+') sum+=num;
else sum-=num;
return sum==0 ;
}
void print()
{
cout<<"1";
for(int i=1; i<n; i++)
cout<<op[i]<<i+1;
cout<<endl;
}
void dfs(int k)
{
if(k==n)
{
if(pd()) print();
return;
}
op[k]=' ';
dfs(k+1);
op[k]='+';
dfs(k+1);
op[k]='-';
dfs(k+1);
op[k]=char(0);
}
int main()
{
cin>>n;
dfs(1);
return 0;
}
完美切题 ∼ \sim ∼