题目大意
给出序列1 2 3 … n,在序列的每个数字之间可以决定是否插入符号“+”、“-”。输出所有结果等于0的式子。
思路
简单枚举,用广搜枚举所有情况即可。
代码
/* ID: lujunda1 LANG: C++ PROG: zerosum */ #include<iostream> #include<stdio.h> #include<cstring> #include<queue> using namespace std; struct state //结构体state用于存储式子。 { char str[20]; }; bool check(char* str,int n) //判断式子str的结果是否为0。 { int len=n*2-1; int sum=0,op=1,temp=1; //sum式子临时的结果。 //op当前运算数的符号。 //temp当前运算数的大小。 for(int i=1;i<len;i++) if(i%2) { if(str[i]==' ') { temp*=10; continue; } sum+=temp*op; op=str[i]=='+'?1:-1; temp=0; } else temp+=str[i]-'0'; return sum+temp*op==0?true:false; //temp*op为str的结果。 } void bfs(int n) { queue<state> q; state head; head.str[0]='1'; head.str[1]='\0'; q.push(head); int temp=1; while(++temp<=n) { int size=q.size(); while(size--) { head=q.front(); q.pop(); head.str[temp*2-3]=' '; //按字典序,先' ',后'+',最后'-'。 head.str[temp*2-2]='0'+temp; head.str[temp*2-1]='\0'; q.push(head); head.str[temp*2-3]='+'; q.push(head); head.str[temp*2-3]='-'; q.push(head); } } while(q.size()) { if(check(q.front().str,n)) printf("%s\n",q.front().str); q.pop(); } } int main() { freopen("zerosum.in","r",stdin); freopen("zerosum.out","w",stdout); int n; scanf("%d",&n); bfs(n); }