ZJU_1145 OR POJ_1100 Dreisam Equations

本文探讨解决等式构造问题的策略,面对等式两边由数和括号组成的挑战,通过预处理空格并识别符号插入位置,实现有效求解。深入分析优先搜索算法,针对最多12个数的限制,确保解决方案的可行性。通过代码实现,展示如何通过遍历字符串、处理数字和符号,最终找到等式成立的方法。

Dreisam Equations

{ 两个网站的题有点不一样(ZJH有特判)POJ时间卡得紧,建议去POJ过 }

题目大意:

  给你一个字符串:是一个等式,等式左边是一个数,右边由若干个数和()构成,要求加入(+、- 或 *)来使得等式成立,注意:这道题抛弃了原本的优先级,除了括号一律采用从左到右的计算顺序。

题目陷阱:

  测试数据中可能有 2= (1)(1) 或者 2=((1)1) ,不一定只是在空格处加符号。

题目思路:

  可以对原字符串进行加工,也就是先预先处理空格,不过这样子比较麻烦,可以考虑到,符号只能加在以下四种情况:

  1.  数字 和 数字 之间

  2.  数字 和 (    之间

  3.  )    和 数字 之间

  4.  )    和 (    之间

  这样子分情况以后就容易了许多,可以遍历一遍字符串,将数字存到num数组,( 当作 -1,)当作 -2,有可能加符号的地方当作 -3;

  然后深入优先搜索,遍历所有可能,因为最多等号右边12个数,也就是最多11个符号,也就是3的11次方,基本不会超时。

AC 代码:(两个网站的题 long long 的格式不一样,所以%I64d 可能需要改下)

  1 #include<stdio.h>
  2 typedef long long LL;
  3 LL sum;
  4 LL num[40],no;
  5 LL st[20],so;
  6 char tt[100];
  7 LL to;
  8 
  9 void push(LL x)
 10 {
 11   if(to==0||to>0&&tt[to-1]=='(') st[so++]=x;
 12   else
 13   {
 14     switch(tt[to-1])
 15     {
 16       case '+':st[so-1]=st[so-1]+x;break;
 17       case '-':st[so-1]=st[so-1]-x;break;
 18       case '*':st[so-1]=st[so-1]*x;break;
 19       default: break;
 20     }
 21     to--;
 22   }
 23 }
 24 
 25 // -4 +
 26 // -5 -
 27 // -6 *
 28 
 29 bool dfs(int pos)
 30 {
 31   if(pos>=no)
 32   {
 33     if(st[so-1]==sum) return true;
 34     else return false;
 35   }
 36   if(num[pos]==-3)
 37   {
 38     LL Sst[20],Sso=so;
 39     for(int i=0;i<so;i++)
 40       Sst[i]=st[i];
 41     char Stt[100];
 42     LL Sto=to;
 43     for(int i=0;i<to;i++)
 44       Stt[i]=tt[i];
 45     num[pos]=-4;
 46     tt[to++]='+';
 47     if(dfs(pos+1)) return true;
 48     so=Sso;
 49     for(int i=0;i<so;i++)
 50       st[i]=Sst[i];
 51     to=Sto;
 52     for(int i=0;i<to;i++)
 53       tt[i]=Stt[i];
 54     num[pos]=-5;
 55     tt[to++]='-';
 56     if(dfs(pos+1)) return true;
 57     so=Sso;
 58     for(int i=0;i<so;i++)
 59       st[i]=Sst[i];
 60     to=Sto;
 61     for(int i=0;i<to;i++)
 62       tt[i]=Stt[i];
 63     num[pos]=-6;
 64     tt[to++]='*';
 65     if(dfs(pos+1)) return true;
 66     num[pos]=-3;
 67   }
 68   else if(num[pos]==-1)
 69   {
 70     tt[to++]='(';
 71     if(dfs(pos+1)) return true;
 72   }
 73   else if(num[pos]==-2)
 74   {
 75     to--;
 76     so--;
 77     push(st[so]);
 78     if(dfs(pos+1)) return true;
 79   }
 80   else
 81   {
 82     push(num[pos]);
 83     if(dfs(pos+1)) return true;
 84   }
 85   return false;
 86 }
 87 int main()
 88 {
 89   char s[100];
 90   int cas=1;
 91   while(gets(s))
 92   {
 93     if(s[0]=='0'&&s[1]==0) break;
 94     int i=0;
 95     no=0;
 96     for(;s[i];i++)
 97     {
 98       if(s[i]<='9'&&s[i]>='0')
 99       {
100         if(no>1&&num[no-1]!=-1) num[no++]=-3;
101         num[no]=0;
102         for(;s[i]<='9'&&s[i]>='0';i++)
103         {
104           num[no]=num[no]*10+s[i]-'0';
105         }
106         no++;
107         i--;
108       }
109       else if(s[i]=='(')
110       {
111         if(no>1&&num[no-1]!=-1) num[no++]=-3;
112         num[no++]=-1;
113       }
114       else if(s[i]==')')
115       {
116         num[no++]=-2;
117       }
118     }
119     sum=num[0];
120     so=to=0;
121     printf("Equation #%d:\n",cas++);
122     if(!dfs(1))
123     {
124       printf("Impossible\n\n");
125     }
126     else
127     {
128       printf("%I64d=",sum);
129       for(int i=1;i<no;i++)
130       {
131         if(num[i]>=0) printf("%I64d",num[i]);
132         else
133         {
134           switch(num[i])
135           {
136             case -1:printf("(");break;
137             case -2:printf(")");break;
138             case -4:printf("+");break;
139             case -5:printf("-");break;
140             case -6:printf("*");break;
141             default:break;
142           }
143         }
144       }
145       printf("\n\n");
146     }
147   }
148   return 0;
149 }

 

转载于:https://www.cnblogs.com/hchlqlz-oj-mrj/p/5235099.html

标题基于Python的自主学习系统后端设计与实现AI更换标题第1章引言介绍自主学习系统的研究背景、意义、现状以及本文的研究方法和创新点。1.1研究背景与意义阐述自主学习系统在教育技术领域的重要性和应用价值。1.2国内外研究现状分析国内外在自主学习系统后端技术方面的研究进展。1.3研究方法与创新点概述本文采用Python技术栈的设计方法和系统创新点。第2章相关理论与技术总结自主学习系统后端开发的相关理论和技术基础。2.1自主学习系统理论阐述自主学习系统的定义、特征和理论基础。2.2Python后端技术栈介绍DjangoFlask等Python后端框架及其适用场景。2.3数据库技术讨论关系型和非关系型数据库在系统中的应用方案。第3章系统设计与实现详细介绍自主学习系统后端的设计方案和实现过程。3.1系统架构设计提出基于微服务的系统架构设计方案。3.2核心模块设计详细说明用户管理、学习资源管理、进度跟踪等核心模块设计。3.3关键技术实现阐述个性化推荐算法、学习行为分析等关键技术的实现。第4章系统测试与评估对系统进行功能测试和性能评估。4.1测试环境与方法介绍测试环境配置和采用的测试方法。4.2功能测试结果展示各功能模块的测试结果和问题修复情况。4.3性能评估分析分析系统在高并发等场景下的性能表现。第5章结论与展望总结研究成果并提出未来改进方向。5.1研究结论概括系统设计的主要成果和技术创新。5.2未来展望指出系统局限性并提出后续优化方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值