题目描述
这道题其实也不难,但是难在判断ap是否合理。
但是细心的我们发现,在样例解释中,条件1表示:保证ap是合法的。包含条件1的数据很多,所以我们不写判断ap是否合理也能拿55分,当然我还是写了满分程序hh
为了使代码简洁,我引用了一些后先进的东东(真的诶~ C语言不算后进吗?)
样例
blablabla
算法1(只有一个哈哈哈)
首先先大概讲一下map。我们可以把它理解为一个 二维数组 (指的是我代码中的啊)。在代码中,string为像二维数组的第一位(也就是 第一行),int 为里面的值。所以我们在查找时就可以直接找啦~ (为啥感觉像作弊)
然后是后 先进 的 sscanf 和 sprintf:
这个啊,这个额
在代码里写吧
好像注释有点多hh
参考文献
C++ 代码
#include <iostream>
#include <map>
#include <cstdio>
#include <cstring>
using namespace std;
int n;
map <string,int> server; //定义一个map,map上面写了哈
bool check(string ip){
int t[6] = {0,-1,-1,-1,-1,-1}; //用来把ip里的数字读出
int cnt = sscanf(ip.c_str(),"%d.%d.%d.%d:%d",&t[1],&t[2],&t[3],&t[4],&t[5]); //cnt存ip里有多少个数据
//好了,后(划掉)先进的sscanf来啦~
//ip.c_str() 比较先进的东东,把ip转换为char类型
//"%d.%d.%d.%d:%d" 跳过.和:,把数据读出
//&t[1],&t[2],&t[3],&t[4],&t[5] 把读出的数据填到t数组里
if(cnt != 5) return false; //如果cnt不等于5,说明数据个数不对,返回不合法
for(int i = 1;i <= 4;i ++){ //判断数据有没有超过上限
if(t[i] < 0 || t[i] > 255) return false;
}
if(t[5] < 0 || t[5] > 65535) return false; //判断数据有没有超过上限
char now[60]; //用来把数字读回,从而卡掉前导0和符号错误
sprintf(now,"%d.%d.%d.%d:%d",t[1],t[2],t[3],t[4],t[5]); //又是一个先进的东东
//和前面差不多
//now 前面那个用来把数字读回,从而卡掉前导0和符号错误的数组
//"%d.%d.%d.%d:%d" 和sscanf效果差不多,只是把数据读回
//t[1],t[2],t[3],t[4],t[5] 和sscanf效果差不多,依次填入%d里
if(now != ip) return false; //如果now不等于原来的ip,说明有前导0或符号错误,返回不合法
return true; //这组数据经过了重重考验,留了下来,返回合法
}
int main(){
cin>>n;
for(int i = 1;i <= n;i ++){
string op,ap;
cin>>op>>ap;
if(!check(ap)) cout<<"ERR"<<endl; //如果返回不合法,输出ERR
else{ //否则就是合法啦~
if(op == "Server"){ //这台机子是服务机
if(server[ap] == 0){ //如果没有出现过,说明可以存下来
server[ap] = i; //把它的编号i存下来
cout<<"OK"<<endl; //输出OK
}
else cout<<"FAIL"<<endl; //否则已有同样ap服务机,输出FAIL
}
else{ //否则就是客户机啦~
if(server[ap] == 0) cout<<"FAIL"<<endl; //如果没有这台服务机,说明这个客户脑子抽了(划掉),写错ap,输出FAIL
else cout<<server[ap]<<endl; //否则连上了,输出服务机编号
}
}
}
return 0; //圆满完成!
}
# 我自己被自己写的题解逗笑了
192:168:0:1.233 这种不合法的输入怎么用sscanf(. . . : , ----)的格式化来进行分段呢?谢谢!
牛
就你这就算最短?
挑战一下嘛,反正我不知道
而且去掉注释感觉挺短的,有的题解里面写的确实很长啊
不错不错!!去掉注释42行,比我的84好的不是一星半点
我99行
还SF了
???这不是我的代码吧
乍一看很简单,仔细一看果然很简单(虽然当时考试没调试出来)
hh