UVa-817 According to Bartjens

2000=要输出IMPOSSIBLE

  1 #include<bits/stdc++.h>
  2 #define _for(i,a,b) for(int i = (a);i < (b);i ++)
  3 #pragma GCC optimize(2)
  4 
  5 using namespace std;
  6 string input;
  7 set<string> rnt;
  8 
  9 int kase = 1;
 10 
 11 bool judge(string a)
 12 {
 13     stack<int> s;
 14     int tmp = 0;
 15     int i;
 16     if(a[0]=='0'&&isdigit(a[1]))
 17         return false;
 18     for(i = 0; isdigit(a[i]); i ++)
 19     {
 20         tmp = tmp*10+a[i]-'0';
 21     }
 22     s.push(tmp);
 23 
 24     for(; a[i]!='=';)
 25     {
 26         tmp = 0;
 27         if(a[i]=='+')
 28         {
 29             if(a[i+1]=='0'&&isdigit(a[i+2]))
 30                 return false;
 31             for(i ++; isdigit(a[i]); i ++)
 32                 tmp = tmp*10+a[i]-'0';
 33             s.push(tmp);
 34         }
 35         else if(a[i]=='-')
 36         {
 37             if(a[i+1]=='0'&&isdigit(a[i+2]))
 38                 return false;
 39             for(i ++; isdigit(a[i]); i ++)
 40                 tmp = tmp*10+a[i]-'0';
 41             s.push(-tmp);
 42         }
 43         else if(a[i]=='*')
 44         {
 45             if(a[i+1]=='0'&&isdigit(a[i+2]))
 46                 return false;
 47             for(i ++; isdigit(a[i]); i ++)
 48                 tmp = tmp*10+a[i]-'0';
 49             int tmp2 = s.top();
 50             s.pop();
 51             s.push(tmp2*tmp);
 52         }
 53     }
 54     int sum = 0;
 55     while(!s.empty())
 56     {
 57         sum += s.top();
 58         s.pop();
 59     }
 60     return sum==2000;
 61 }
 62 
 63 const char op[] {'+','-','*'};
 64 void dfs(int d,string a)
 65 {
 66     if(a[d+1]=='=')
 67     {
 68         if(judge(a))
 69         {
 70             rnt.insert(a);
 71         }
 72         return ;
 73     }
 74 
 75     if(isdigit(a[d]))
 76     {
 77         int i;
 78         for(i = 0;i < 4;i ++)
 79         {
 80             if(i==0)
 81             {
 82                 dfs(d+1,a);
 83             }
 84             else
 85             {
 86                 string b = a.insert(d+1,1,op[i-1]);
 87                 dfs(d+1,b);
 88                 a.erase(d+1, 1);
 89             }
 90         }
 91     }
 92     else
 93         dfs(d+1,a);
 94 }
 95 void solve()
 96 {
 97     rnt.clear(); 
 98     if(input.size()==2||input=="2000=")
 99         return ;
100     dfs(0,input);
101 }
102 void printRnt()
103 {
104     printf("Problem %d\n",kase ++);
105     for(auto s:rnt)
106         printf("  %s\n",s.c_str());
107     if(rnt.size()==0)
108         printf("  IMPOSSIBLE\n");
109 }
110 int main()
111 {
112     while(getline(cin,input))
113     {
114         if(input[0]=='=')
115             break;
116         solve();
117         printRnt();
118     }
119     return 0;
120 }

 

转载于:https://www.cnblogs.com/Asurudo/p/10150550.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值