zoukankan      html  css  js  c++  java
  • Codeforces 292C. Beautiful IP Addresses解题报告(Brute Force)

    传送门
    题意:给你N个数,求符合标准ip地址规则的所有ip地址,要求每个数都至少用一次。


    思路:暴力dfs一位一位向后加数,我用的位运算判断是否使用过和mask比较,dfs到最后一位加点,然后把答案存起来最后输出就ok了(简称暴力)


    AC程序

    //库省略
    using namespace std;
    vector<string> ans;
    int mask,n;
    bool check(string s,int l,int r)
    {
        if(s[l]=='0')
        {
            if(r==l+1)
                return 1;
            else
                return 0;
        }
        int t=0;
        for(int i=l;i<r;i++)
        {
            t*=10;
            t+=(s[i]-'0');
        }
        if(t>=0 && t<256)
        return 1;
        return 0;
    }
    void adp(string s)
    {
        int n=s.size(),k;
        for(int i=1;i<=3;i++)
        {
            for(int j=i+1;j<=i+3;j++)
            {
                for(int k=j+1;k<=j+3;k++)
                {
                    if(n-k>=1 && n-k<=3)
                    {
                        if(check(s,0,i) && check(s,i,j) && check(s,j,k) && check(s,k,n))
                        {
                            string t=s.substr(0,i)+"."+s.substr(i,j-i)+"."+s.substr(j,k-j)+"."+s.substr(k,n-k);
                            ans.pb(t);
                        }
                    }
                }
            }
        }
    }
    void dfs(int now,int tar,string s,int used)
    {
        if(tar==now)
        {
            if(used==mask)
            adp(s);
            return;
        }
        int nex=tar-1-now;
        if(nex<now)
        {
            if(mask!=used)
            return;
            dfs(now+1,tar,s+s[nex],used);
        }
        else
        {
            for(int i=0;i<10;i++)
            {
                if(mask&(1<<i))
                {
                    dfs(now+1,tar,s+char('0'+i),used|(1<<i));
                }
            }
        }
    }
    int main()
    {
        cin>>n;
        for(int i=0;i<n;i++)
        {
            int x;
            cin>>x;
            mask|=(1<<x);
        }
        if(n<=6)
        {
            for(int i=4;i<=12;i++)
            {
                dfs(0,i,"",0);
            }
        }
        cout<<ans.size()<<endl;
        for(int i=0;i<ans.size();i++)
        cout<<ans[i]<<endl;
        return 0;
    }
    
    
  • 相关阅读:
    Gym
    [APIO2014] 回文串
    python选课系统
    python面向对象之类成员修饰符
    python面向对象之类成员
    python的shelve模块
    python的re模块
    python的configparser模块
    python的sys和os模块
    python的hashlib模块
  • 原文地址:https://www.cnblogs.com/NightRaven/p/9453923.html
Copyright © 2011-2022 走看看