• 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;
    }
    
    
  • 相关阅读:
    个人博客作业Week2
    个人作业
    软件工程——个人博客作业三
    软工个人博客二
    软件工程——个人博客作业一
    Linux服务器搭建常用环境(一)
    Swift学习之语言基础
    Python——函数的参数
    Python——函数的调用
    Python 导语
  • 原文地址:https://www.cnblogs.com/NightRaven/p/9453923.html
Copyright © 2020-2023  润新知