恢复IP地址

目的:掌握基本递归算法设计

内容:编写程序exp5-3.cpp,恢复IP地址。给定一个仅仅包含数字的字符串,恢复它的所有可能的有效IP地址。例如,给定字符串为“22522511135”,返回“225.225.11.135”和“225.225.111.35”(顺序可以任意)。

思路:首先要确定退出递归的条件有:

  • 扫描的迭代器大于字符串长度
  • 递归次数大于3
  • 截取的字符串的第一个字符为0并且后面还有字符
  • 截取的字符串数字大于255

然后判断是否要添加"."或者是递归次数等于3时把它放进result中,递归查找下一个可能出现的情况。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<string>
#include<cmath>
#include<stdlib.h>
#include <set>
using namespace std;
string s;
set <string> result;
void getIP(string temp,int st,int en,int time)//获取IP地址
{
    if(en>s.size())
        return ;
    if(time>3)
        return ;
    string sub=s.substr(st,en-st);
    if(sub[0]=='0'&&sub.size()>1)
        return ;
    int num=atoi(sub.substr(0,en-st).c_str());
    if(num>255)
        return ;
    temp+=sub;
    if(en!=s.size())
        temp+=".";
    else
    {
        if(time==3)
            result.insert(temp);
            return ;
    }
    getIP(temp,en,en+1,time+1);
    getIP(temp,en,en+2,time+1);
    getIP(temp,en,en+3,time+1);
}
void printfIP()//输出结果
{
    if(result.empty())
    {
        printf("输入不合法\n");
    }
    else
    {
        set <string>::iterator a;
        printf("可能有效的IP地址有:\n");
        for(a=result.begin();a!=result.end();a++)
            cout<<*a<<endl;
        result.clear();
    }
    return ;
}
int main()
{
    while(~printf("请输入需要恢复的IP地址:\n"))
    {
        int num;
        cin>>s;
        string temp="";
        getIP(temp,0,1,0);
        getIP(temp,0,2,0);
        getIP(temp,0,3,0);
        printfIP();
        printf("继续请输入1,退出操作请输入0\n");
        cin>>num;
        if(num==0)
            break;
        else
            continue;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值