传送门
题意:给你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;
}