acm之旅--合格的IP地址

天津大学智能与计算学部夏令营机试(TOJ)的第三题

思路:将字符串分成4个部分,且保证每一个部分在三个字符以内,然后每个部分的子字符串必须小于"255"的字符串,求出将分割出的4个部分均符合以上条件分割数即可。

代码:

#include 
#include 
using namespace std;

int main()
{
    int T;
    string s;
    cin >> T;
    while(T--)
    {
        cin >> s;
        int len = s.size();
        if(len==4)//当长度为4时,只能是一个
        {
            cout << 1 << endl;
            continue;
        }
        if(len>12)//超出IP的表示范围
        {
            cout << 0 << endl;
            continue;
        }
        int sum = 0;
        for(int i=0; i<min(len-3, 3); i++)//范围的确定:保证后面可以分成3部分且该部分长度不超过3
        {
            string a = s.substr(0, i+1);//表示[0,i]区间内的字符串
            if(a>"255") continue;
            for(int j=i+1; j<min(len-2, i+4); j++)
            {
                string b = s.substr(i+1, j-i);//表示[i+1,j]区间内的字符串
                if(b>"255") continue;
                for(int k=j+1; k<min(len-1, j+4); k++)
                {
                    string c = s.substr(j+1, k-j);//表示[j+1,k]区间内的字符串
                    if(c>"255") continue;
                    string d = s.substr(k+1, len-k);//表示[k+1,len]区间内的字符串
                    if(d>"255"||d.size()>3) continue;//最后还需要判断是否在3个字符范围内
                    sum++;
                }
            }
        }
        cout << sum << endl;
    }
    return 0;
}

你可能感兴趣的:(ACM刷题之路)