zoukankan      html  css  js  c++  java
  • 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;
    }
    

  • 相关阅读:
    JSON对象和字符串之间的相互转换
    php小数取整的方法
    Vim之Nerd Tree杂草帮助
    PHP获取汉字拼音首字母
    chmod 变更文件或目录的权限
    grep
    tar
    Linux下socket编程 多线程 进程超时阻塞、卡死问题定位
    一些Lambda表达式的学习
    读高性能MySQL的笔记
  • 原文地址:https://www.cnblogs.com/csnd/p/12063223.html
Copyright © 2011-2022 走看看