本题两种解法:
一、DFS。
二、三进制枚举。
本题涉及到用栈模拟计算器的方法。
/*
ID:szwjcch971
TASK:zerosum
LANG:C++
*/
#include "stdio.h"
#include "string.h"
char fuhao[4]=" +-";
int stack[30];
int n,top=0;
FILE *fin=fopen("zerosum.in","r");
FILE *fout=fopen("zerosum.out","w");
void Push_into_Stack(int x){
int i,j,k,temp,p,jingzhi3[10];
p=1;
for(i=1;i<=n-1;i++){
jingzhi3[n-i]=x%3;
x/=3;
}
for(i=1;i<=n-1;i++){
k=jingzhi3[i];
switch(k){
case 0:
p=p*10+i+1;
break;
case 1:
top++;
stack[top]=p;
p=i+1;
top++;
stack[top]=-100;
break;
case 2:
top++;
stack[top]=p;
p=i+1;
top++;
stack[top]=-200;
break;
default:break;
}
}
top++;stack[top]=p;
}
int Calculate(int stack[30]){
int i=1,p;
while(i<top){
switch(stack[i+1]){
case -100:
stack[i+2]=stack[i]+stack[i+2];
i+=2;
break;
case -200:
stack[i+2]=stack[i]-stack[i+2];
i+=2;
break;
default:break;
}
}
return stack[top];
}
void Print(int x){
int i,k,jingzhi3[10];
for(i=1;i<=n-1;i++){
jingzhi3[n-i]=x%3;
x/=3;
}
for(i=1;i<=n-1;i++){
fprintf(fout,"%d",i);
k=jingzhi3[i];
fprintf(fout,"%c",fuhao[k]);
}
fprintf(fout,"%d\n",n);
};
int main(){
int i,j,k,l;
int pw3[9]={1,3,9,27,81,243,729,2187,6561};
fscanf(fin,"%d",&n);
for(i=0;i<pw3[n-1];i++){
top=0;memset(stack,0,sizeof(stack));
Push_into_Stack(i);
l=Calculate(stack);
if(!l){Print(i);
//fprintf(fout,"I=%d, Answer=%d.\n",i,l);
}
}
return 0;
}