1 条题解

  • 0
    @ 2025-4-12 23:24:17

    采用DFS搜索解决。由于数字的位置是固定的,所以在符号的位置上不断地尝试三种符号即可,若最终的表达式结果为0且是前20个表达式,则输出该表达式。当处理完所有数字(num = n)时,检查最终表达式的值是否为零。若为零且组合数不超过 20,输出该表达式。

    
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cstdlib>
    #include <stack>
    #include <queue>
    #include <map>
    #include <string>
    #include <vector>
    #include <cmath>
    using namespace std ;
     
    const int MX = 100 + 5 ;
    const int INF = 0x3f3f3f3f ;
    int n ,ans ;
    char s[MX] ;
    void dfs(int num ,int sum ,int temp ,int pre ,int di) // sum 已经计算的总和
    {
        if(n == num)
        {
            if(s[num-1] != '.')
                   sum += temp*pre ;
            else  //  大于等于 10 的时候特殊
            {
                if(num < 10)
                    sum += (temp*10 + num)*pre ;
                else  sum += (temp*100 + num)*pre ;
            }
            if(sum)  return ;
            ans++ ;
            if(ans > 20)  return ;
            cout<<1 ;
            for(int i = 2 ;i <= n ; ++i)
               cout<<" "<<s[i-1]<<" "<<i ;
               cout<<endl ;
            return ;
        }
        int Temp = temp ;
        if(s[num-1] == '.')
        {
            if(num < 10)
                 Temp = temp*10 + num ;
            else  Temp = temp*100 + num ;
        }
        s[num] = '+' ;  // +
        dfs(num+1 ,sum + Temp*pre ,num+1 ,1 ,0) ;
        s[num] = '-' ;   // -
        dfs(num+1 ,sum + Temp*pre ,num+1 ,-1 ,0) ;
        s[num] = '.' ;  // .
        if(!di)      // 第一次放点
                  dfs(num+1 ,sum ,num ,pre ,di+1) ;
        else
        {
            if(num < 10) //  注意 >= 10 是需要乘 100 
                    dfs(num+1 ,sum , temp*10 + num ,pre ,di+1) ;
            else    dfs(num+1 ,sum ,temp*100 + num ,pre ,di+1) ;
        }
    }
    int main()
    {
        while(~scanf("%d" ,&n))
        {
            ans = 0 ;
            s[0] = '+' ;  // 
            dfs(1 ,0 ,1 ,1 ,0) ; //主要是点的情况特殊
            cout<<ans<<endl ;
        }
        return 0 ;
    }
    • 1

    信息

    ID
    951
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者