USACO 2.3.3 Zero Sum

来源:互联网 发布:floyd算法结果如何看 编辑:程序博客网 时间:2024/05/16 06:31

本题两种解法:

一、DFS。

二、三进制枚举。

本题涉及到用栈模拟计算器的方法。

/*ID:szwjcch971TASK:zerosumLANG: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;}


0 0
原创粉丝点击