博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

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;
}

posted @ 2018-08-10 11:19  NTR-NightRaven  阅读(208)  评论(0编辑  收藏  举报