零点问题 解题报告

来源:互联网 发布:淘宝禁止出售保护动物 编辑:程序博客网 时间:2024/04/28 22:10

别管最上面那一堆东西。。

【解题思路】

这道题用搜索不难想到。每一次只需要扩展状态,枚举每一个空位是' ','+','-'中的哪一个就行了,为了方便刚开始可以用123来表示;

这样我们每一次可以生成一个合格的表达式,,然后就把表达式求值就可以了,求值的过程有点繁琐,但是难度并不大。

【数据分析】范围是3~9暴搜没有问题。

【代码】

#include<iostream>#include<cstdio>#include<cstring>using namespace std;int a[100],b[100],num[100],f[100];int i,n;int jiajian(int a,int b,int c){if (c==2) return a+b;if (c==3) return a-b;}void sum()//表达式的求值和输出,,其他的做法也都可以。。{int j=0,k=0,l=0,s=0;memset(num,0,sizeof(num));memset(f,0,sizeof(f));while (j<n){j++;l++;num[l]=a[j];f[l]=b[j];k=0;while (f[l]==1){k++;num[l]=num[l]*10+a[j+k];f[l]=b[j+k];}j+=k;}s=num[1];for (j=1;j<l;++j)  s=jiajian(s,num[j+1],f[j]);if (s==0){for (j=1;j<n;++j){printf("%d",a[j]);if (b[j]==2) printf("+");if (b[j]==3) printf("-");if (b[j]==1) printf(" ");}printf("%d\n",a[n]);}}void dfs(int dep){int r;if (dep==n){sum();return;}for (r=1;r<=3;++r)//枚举三种情况{b[dep]=r;dfs(dep+1);}}int main(){freopen("zerosum.in","r",stdin);freopen("zerosum.out","w",stdout);memset(a,0,sizeof(a));memset(b,0,sizeof(b));scanf("%d",&n);for (i=1;i<=n;++i)  a[i]=i;//数字必须连续dfs(1);return 0;}


0 0
原创粉丝点击