• hdu4403暴力搜索


    题意:
         给你一个数字串,让你在里面添加一个=和若干个+,使等式成立.


    思路:

         lmax最大是15,直接暴搜,无压力,关键是判重,要在答案的时候判重,一开始在进队列之前判的,各种wa,哎!后来才发现如果在之前判断就不能得到当前什么符号都不加,而下一个有符号了,判重我用的是map,随意什么只要别爆内存就行,水搜索竟然调了2个小时,丢脸啊...


    #include<stdio.h>
    #include<string.h>
    #include<queue>
    #include<map>
    
    using namespace std;
    
    typedef struct
    {
       int mk[16];
       char str[16];
       int nowid ,deng;
    }NODE;
    
    NODE xin ,tou;
    int nn;
    map<__int64 ,__int64>mark;
    
    bool MK(NODE aa)
    {
       __int64 sum = 0;
       for(int i = 0 ;i <= nn ;i ++)
       sum = sum * 10 + aa.mk[i];
       if(mark[sum]) return 1;
       mark[sum] = 1;
       return 0;
    }
    
    bool ok(NODE tou)
    {
       if(tou.deng)
       {
             int l ,r;
             l = r = 0;
             int sum = 0;
             int mki;
             for(int i = 0 ;tou.mk[i] != 2 ;i ++)
             {
                if(tou.mk[i] == 1)
                {
                   l += sum;
                   sum = tou.str[i] - 48;
                }
                else
                {
                   sum = sum * 10 + tou.str[i] - 48;
                }
                mki = i;
             }
             l += sum;
             sum = 0;
             for(int i = mki + 1;i <= nn ;i ++)
             {
                if(tou.mk[i] == 1)
                {
                   r += sum;
                   sum = tou.str[i] - 48;
                }
                else
                {
                   sum = sum * 10 + tou.str[i] - 48;
                }
             }
             r += sum;
        return l == r && !MK(tou);    
        }
        return 0;
    }
    
    int BFS()
    {
       memset(xin.mk ,0 ,sizeof(xin.mk));
       nn = strlen(xin.str) - 1;
       xin.nowid = 0;
       xin.deng = 0;
       queue<NODE>q;
       q.push(xin);
       int ans = 0;
       mark.clear();
       while(!q.empty())
       {
          tou = q.front();
          q.pop();
          if(ok(tou))
          ans ++;
          if(tou.nowid == nn) continue;      
          if(!tou.deng)// =
          {
             xin = tou;
             xin.deng = 1;
             xin.nowid = tou.nowid + 1;
             xin.mk[xin.nowid] = 2;
             q.push(xin);  
          }
             
          //+
          xin = tou;
          xin.deng = tou.deng;
          xin.nowid = tou.nowid + 1;
          xin.mk[xin.nowid] = 1;
          q.push(xin);
          
          
          //
          xin = tou;
          xin.deng = tou.deng;
          xin.nowid = tou.nowid + 1;
          xin.mk[xin.nowid] = 0;
          q.push(xin);
       } 
       return ans;
    }
    
    int main ()
    {
       while(~scanf("%s" ,xin.str) && strcmp("END" ,xin.str))
       {
          printf("%d
    " ,BFS());
       }
       return 0;
    }
    

  • 相关阅读:
    26 转义符 re模块 方法 random模块 collection模块的Counter方法
    25 正则表达式
    24 from 模块 import 名字
    24 from 模块 import 名字
    24 from 模块 import 名字
    23 析构方法 items系列 hash方法 eq方法
    21 isinstance issubclass 反射 _str_ _new_ _len_ _call_
    20 属性, 类方法, 静态方法. python2与python3的区别.
    python(1)
    python之字符串格式化
  • 原文地址:https://www.cnblogs.com/csnd/p/12063222.html
Copyright © 2020-2023  润新知