数据量很小..最多N=9..那么最多就是填8个符号 ( + , - , 空格 )..状态总数最多为3^8=6561..表示可以接受...那么就枚举所有的符号位..为了方便枚举就用一个十进制数..每输入一个N就从3^N这个十进制数开始~~每次展开成N位的3进制数~~每一位九对应着式子的每个符号位...
对于“空格"这种情况...为了方便处理我开了一个双向链表,类似Dancing Link的思想很方便的就把一个节点给删去..
在做运算时每次的结果都存在运算符后面那位上...那么最后的结果就是在h[n].x里了..
最后排序按要求输出...
Program:
/* ID: zzyzzy12 LANG: C++ TASK: zerosum */ #include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #include<queue> using namespace std; int k,n,i,num,p; struct node { int x,next,pre,t; }h[10]; string s[10001],str; int main() { freopen("zerosum.in","r",stdin); freopen("zerosum.out","w",stdout); cin>>n; k=(int)pow(3,n-1); num=0; while (k--) { p=k+1; for (i=1;i<=n;i++) { h[i].x=i; h[i].next=i+1; h[i].pre=i-1; } str=""; for (i=1;i<n;i++) { str+=char(i+'0'); if (p%3==0) { h[i+1].x+=10*h[i].x; h[h[i].pre].next=h[i].next; h[h[i].next].pre=h[i].pre; h[i].t=0; str+=" "; }else if (p%3==1) { h[i].t=1; str+="+"; }else { h[i].t=2; str+="-"; } p/=3; } str+=char(n+'0'); i=1; while (!h[i].t && i<n) i++; while (i!=n) { if (h[i].t==1) h[h[i].next].x+=h[i].x; else h[h[i].next].x=h[i].x-h[h[i].next].x; i=h[i].next; } if (!h[n].x) { num++; s[num]=str; } } sort(s+1,s+1+num); for (i=1;i<=num;i++) cout<<s[i]<<endl; return 0; }
本文探讨了在数据量极小的情况下,如何通过枚举所有可能的符号组合来生成并解决数学表达式。利用十进制数表示三进制状态,通过双向链表高效地操作符号位,并在运算过程中直接更新结果。最终,通过排序输出所有满足条件的表达式。此方法特别适用于简化计算过程,尤其是在资源受限环境中。
227

被折叠的 条评论
为什么被折叠?



