六月模拟:猪国杀
山东大学计算机科学与技术学院程序设计思维与实践作业
山大程序设计思维与实践
sdu程序设计思维与实践
山东大学程序设计思维实践作业H
山大程序设计思维实践作业H
山东大学程序设计思维与实践

相关资料:GitHub

猪国杀(模板)

请使用指定的代码模板完成该题~
由于原题在题面和数据上的一些小问题,本题经过了一些小修小改,数据,和题面,与 SDOI2010 略有不同。参考网络资料将让你在完成作业的路径上绕远路(不保证可行)并且收获甚少。相信自己,独立完成会收获很多,你也可以在思考无所获后向同学请教。
代码模板精心制作,请大家理解后进行补全代码实验
本题代码模板不严格遵守面向对象的规则,而是面向教育用途设计
比起费力优化代码的常数复杂度,更乐于精心设计将代码逻辑区分开
本实验考点:
问题理解及其逻辑化能力
大型(显然并不大 第三方代码框架理解和分析能力
工程改动的创口分析和实践能力
程序调试能力
期末将近,预祝同学们期末考得好成绩,不负努力,加油。
背景
《猪国杀》是一种多猪牌类回合制游戏,一共有 3 种角色:主猪,忠猪,反猪。每局游戏主猪有且只有 1 只,忠猪和反猪可以有多只,每只猪扮演 1 种角色。

目的
主猪 / MP:自己存活的情况下消灭所有的反猪。
忠猪 / ZP:不惜一切保护主猪,胜利条件与主猪相同。
反猪 / FP:杀死主猪。

游戏过程
游戏开始时,每个玩家手里都会有 4 张牌,且体力上限和初始体力都是 4 。

开始游戏时,从主猪开始,按照逆时针方向(数据中就是按照编号从 1,2,3…n 的顺序)依次行动。

每个玩家自己的回合可以分为 2 个阶段:

摸牌阶段:从牌堆顶部摸 2 张牌,依次放到手牌的最右边;
出牌阶段:你可以使用任意张牌,每次使用牌的时候都使用最靠左的能够使用的牌。当然,要满足如下规则:
如果没有猪哥连弩,每个出牌阶段只能使用 1 次「杀」来攻击;
任何牌被使用后被弃置(武器是装备上);被弃置的牌以后都不能再用,即与游戏无关。
各种牌介绍
每张手牌用 1 个字母表示,字母代表牌的种类。

基本牌
『桃 / P』在自己的回合内,如果自己的体力值不等于体力上限,那么使用 1 个桃可以为自己补充 1 点体力,否则不能使用桃;桃只能对自己使用;在自己的回合外,如果自己的血变为 0 或者更低,那么也可以使用。

『杀 / K』在自己的回合内,对攻击范围内除自己以外的 1 名角色使用。如果没有被『闪』抵消,则造成 1 点伤害。无论有无武器,杀的攻击范围都是 1。

『闪 / D』当你受到杀的攻击时,可以弃置 1 张闪来抵消杀的效果。

锦囊牌
『决斗 / F』出牌阶段,对除自己以外任意 1 名角色使用,由目标角色先开始,自己和目标角色轮流弃置 1 张杀,首先没有杀可弃的一方受到 1 点伤害,另一方视为此伤害的来源。

『南猪入侵 / N』出牌阶段,对除你以外所有角色使用,按逆时针顺序从使用者下家开始依次结算,除非弃置 1 张杀,否则受到 1 点伤害。

『万箭齐发 / W』和南猪入侵类似,不过要弃置的不是杀而是闪。

『无懈可击 / J』在目标锦囊生效前抵消其效果。每次有 1 张锦囊即将生效时,从使用这张锦囊的猪开始,按照逆时针顺序,依次得到使用无懈可击的机会;效果:用于决斗时,决斗无效并弃置;用于南猪入侵或万箭齐发时,当结算到某个角色时才能使用,当前角色不需弃置牌并且不会受到伤害(仅对 1 个角色产生效果);用于无懈可击时,成为目标的无懈可击被无效。

装备牌
『猪哥连弩 / Z』武器,攻击范围 1 ,出牌阶段你可以使用任意张杀; 同一时刻最多只能装 1 把武器;如果先前已经有了 1 把武器,那么之后再装武器的话,会弃置以前的武器来装现在的武器。

特殊事件及概念解释
伤害来源:杀、南猪入侵、万箭齐发的伤害来源均是使用该牌的猪,决斗的伤害来源如上;

距离:两只猪的距离定义为沿着逆时针方向间隔的猪数 +1 。即初始时 1 和 2 的距离为 1 ,但是 2 和 1 的距离就是 n−1 。注意一个角色的死亡会导致一些猪距离的改变;

玩家死亡:如果该玩家的体力降到 0 或者更低,并且自己手中没有足够的桃使得自己的体力值回到 1 ,那么就死亡了,死亡后所有的牌(装备区,手牌区)被弃置

奖励与惩罚:反猪死亡时,最后一个伤害来源处(即使是反猪)立即摸 3 张牌。忠猪死亡时,如果最后一个伤害来源是主猪,那么主猪所有装备牌、手牌被弃置。

注意:一旦达成胜利条件,游戏立刻结束,因此即使会摸 3 张牌或者还有牌可以用也不用执行了。

现在,我们已经知道每只猪的角色、手牌,还有牌堆初始情况,并且假设每个角色会按照如下的行为准则进行游戏,你需要做的就是告诉最后的结果。

几种行为:
献殷勤:使用无懈可击挡下南猪入侵、万箭齐发、决斗;使用无懈可击抵消表敌意的锦囊效果;
表敌意:对某个角色使用杀、决斗;使用无懈可击抵消献殷勤的锦囊效果;
跳忠:即通过行动表示自己是忠猪。跳忠行动就是对主猪或对某只已经跳忠的猪献殷勤,或者对某只已经跳反的猪表敌意;
跳反:即通过行动表示自己是反猪。跳反行动就是对主猪或对某只已经跳忠的猪表敌意,或者对某只已经跳反的猪献殷勤。

注意:忠猪不会跳反,反猪也不会跳忠;不管是忠猪还是反猪,能够跳必然跳。

行动准则
共性
每个角色如果手里有桃且生命值未满,那么必然吃掉;
有南猪入侵、万箭齐发、必然使用;有装备必然装上;
受到杀时,有闪必然弃置;
响应南猪入侵或者万箭齐发时候,有杀 / 闪必然弃置;
不会对未表明身份的猪献殷勤(包括自己)。
特性
主猪:

主猪会认为「没有跳身份,且用南猪入侵 / 万箭齐发对自己造成伤害的猪」是类反猪(没伤害到不算,注意类反猪并没有表明身份),如果之后跳了,那么主猪会重新认识这只猪;
对于每种表敌意的方式,对逆时针方向能够执行到的第一只已跳反猪表;如果没有,对逆时针方向能够执行到的第一只类反猪表,再没有,那么就不表敌意;
决斗时会不遗余力弃置杀;
如果能对已经跳忠的猪或自己献殷勤,那么一定献;如果能够对已经跳反的猪表敌意,那么一定表。
忠猪:

对于每种表敌意的方式,对「逆时针方向能够执行到的第一只已经跳反的猪」表,如果没有,那么就不表敌意;
决斗时,如果对方是主猪,那么不会弃置杀,否则,会不遗余力弃置杀;
如果有机会对主猪或者已经跳忠的猪献殷勤,那么一定献。
反猪:

对于每种表敌意的方式,如果有机会则对主猪表,否则,对「逆时针方向能够执行到的第一只已经跳忠的猪」表,如果没有,那么就不表敌意;
决斗时会不遗余力弃置杀;
如果有机会对已经跳反的猪献殷勤,那么一定献。
输入格式
输入文件第一行包含两个正整数 n(2⩽n⩽10) 和 m(m⩽2000),分别代表玩家数和牌堆中牌的数量。数据保证牌的数量够用。

接下来 n 行,每行 5 个字符串,依次表示对第 i 只猪的角色和初始 4 张手牌描述。编号为 1 的肯定是主猪。

再接下来一行,一共 m 个字符串,按照从牌堆顶部到牌堆底部的顺序描述每张牌。

注意:所有的相邻的两个字符串都严格用 1 个空格隔开,行尾没有多余空格。

输出格式
输出数据第一行包含一个字符串代表游戏结果。如果是主猪胜利,那么输出 MP ,否则输出 FP 。数据保证游戏总会结束。

接下来 n 行,第 i 行是对第 i 只猪的手牌描述(注意只需要输出手牌),按照手牌从左往右的顺序输出,相邻两张牌用 1 个空格隔开,行末尾没有多余空格。如果这只猪已阵亡,那么只要输出 DEAD 即可。

注意:如果要输出手牌而没有手牌的话,那么只需输出 1 个空行。

样例
Input:

3 10
MP D D F F
ZP N N N D
FP J J J J
F F D D J J F F K D
Output:

FP
DEAD
DEAD
J J J J J J D
解释:

第一回合:

主猪没有目标可以表敌意;
接下来忠猪使用了 3 张南猪入侵,主猪掉了 3 点体力,并认为该角色为类反猪,3 号角色尽管手里有无懈可击,但是因为自己未表明身份,所以同样不能对自己用,乖乖掉 3 点体力;
下一回合:

反猪无牌可出;
接下来主猪对着类反猪爆发,使用 4 张决斗,忠猪死亡,结果主猪弃掉所有牌;
子任务
一共 20 组测试数据,每个点 5 分。

10% 的数据没有锦囊牌,另外 20% 的数据没有无懈可击。

测试样例
样例 1
输入:
3 25
MP K K K K
ZP Z Z Z Z
FP J J J J
K K Z Z J J K K W Z W W K Z J J K K J J K K W W W
输出:
FP
DEAD
DEAD
J J J J J J J J J J W

起始代码为只读模式,将在编译前被插入到答案代码的上方
#include <bits/stdc++.h>
#define rep(i, s, t) for(int i=s;i<=t;i++)
using namespace std;/* 全局变量 */
int n;                   // 猪的数量
queue<char> allCards;    // 牌堆struct Pig {/* 属性 */int index;            // 当前猪下标int hp = 4;           // 血量char type;            // 猪的类型: M, Z, Fchar jumpType = 0;    // 跳的类型: Z(忠), F(反), f(MP视角的类反), 0(空), 注意对MP来说针对F更优先于fbool arming = false;  // 有无装备list<char> cards;     // 手中的牌
/* 方法定义, 这里是完成本题必须的方法, 可以不必多定义了 */void jump(){jumpType = type=='F'?'F':'Z';} // 跳阵营bool isJumpItsFriend(Pig* pig) { return pig->type == 'F' ? jumpType == 'F' : jumpType == 'Z'; } // 我跳它朋友了吗?Pig* getNextPig();    // 获取存活的下家void addCards(int num);// 从牌堆拿牌放到自己手右bool del(char c);     // 删掉手里一张牌, 删成功则返回truevoid hurt(Pig* attacker);// 被攻击掉一点血bool cost(Pig* attacker, char c);// 被迫消耗手中一张牌, 消耗成功返回true并不减血, 否则减血, 减血到0尝试用桃, 无则死亡, 根据身份对杀者做后续处理bool useP();          // 主动使用桃, 满足使用条件就使用, 使用后返回truebool useK();          // 主动使用杀, 满足使用条件就使用, 使用后返回truebool useF();          // 主动使用决斗, 满足使用条件就使用, 使用后返回truebool useN();          // 主动使用南猪入侵, 满足使用条件就使用, 使用后返回truebool useW();          // 主动使用万箭齐发, 满足使用条件就使用, 使用后返回truebool findJ(Pig* attacker); // 被迫去求无懈可击, 求到则返回truebool useJ(Pig* pig);  // 帮某个猪用无懈可击, 用成功返回true
} ps[15];/* 全局方法 */
bool isGameEnd() {if (ps[0].hp <= 0) return true;rep(i, 1, n-1)if (ps[i].type == 'F' && ps[i].hp > 0)return false;return true;
}
int cnt = 0;
void judgeGameEnd() {if (isGameEnd()) {printf(ps[0].hp > 0 ? "MP\n" : "FP\n");rep(i, 0, n-1) {if (ps[i].hp <= 0) {printf("DEAD\n");} else {for (list<char>::iterator it = ps[i].cards.begin(); it != ps[i].cards.end(); it++)printf(it==ps[i].cards.end()?"%c":"%c ", *it);printf("\n");}}exit(0);}
}void solve() {ps[0].jump();while (true) {rep(i, 0, n-1) {if (ps[i].hp <= 0) continue;ps[i].addCards(2);bool usedK = false;for (list<char>::iterator it = ps[i].cards.begin(); it != ps[i].cards.end(); it++) {bool used = false;char c = *it;it = ps[i].cards.erase(it);switch (c) {case 'P': used = ps[i].useP(); break;case 'K': if (!usedK || ps[i].arming) used = usedK = ps[i].useK(); break;case 'F': used = ps[i].useF(); break;case 'N': used = ps[i].useN(); break;case 'W': used = ps[i].useW(); break;case 'Z': ps[i].arming = used = true; break;}if (used) it = --ps[i].cards.begin();else it = ps[i].cards.insert(it, c);if (ps[i].hp <= 0) break;}}}
}
/* 主控方法 */
int main() {// Inputint m; scanf("%d%d", &n, &m);char s[5];rep(i, 0, n-1) {ps[i].index = i;scanf("%s", s), ps[i].type = s[0];rep(j, 1, 4) scanf("%s", s), ps[i].cards.push_back(s[0]);}while(m--) scanf("%s", s), allCards.push(s[0]);// To solvesolve();
}Pig* Pig::getNextPig() {int nxt = (index + 1) % n;while (ps[nxt].hp <= 0) {nxt = (nxt+1) % n;}return &ps[nxt];
}void Pig::addCards(int num) {rep(i,1,num) {cards.push_back(allCards.front());allCards.pop();}
}bool Pig::useP() {if (hp < 4) {hp ++;return true;}return false;
}void Pig::hurt(Pig *attacker) {if (--hp == 0) {if (this->del('P')) {this->useP();} else {judgeGameEnd();switch(type) {case 'F': attacker->addCards(3); break;case 'Z': if (attacker->type == 'M') attacker->cards.clear(), attacker->arming=false; break;}}}
}bool Pig::cost(Pig* attacker, char c) {if (this->del(c)) {return true;}hurt(attacker);return false;
}bool Pig::findJ(Pig *attacker) {Pig* nxt = attacker;do {// "找个好心的猪猪帮我挡刀"if (this->isJumpItsFriend(nxt) && nxt->del('J')) {nxt->jump();return !nxt->useJ(this);}nxt = nxt->getNextPig();} while (nxt != attacker);return false;
}bool Pig::useJ(Pig *pig) {for (Pig* nxt = getNextPig(); nxt != this; nxt = nxt->getNextPig()) {// "套娃指找找有没有猪猪会阻止我帮别人挡刀"if (!this->isJumpItsFriend(nxt) && nxt->del('J')) {nxt->jump();return !pig->findJ(nxt);}}return false;
}

答案代码:

bool Pig::useK() {  //使用杀 // TODO: 补全代码Pig* pri=this->getNextPig();//获取存活的下家 int p=pri->index;if(type=='M') //主猪 {if(ps[p].jumpType=='F'||ps[p].jumpType=='f'){jump();bool flag=ps[p].cost(this,'D'); //闪  return true;} }else if(type=='Z') //忠猪 {if(ps[p].jumpType=='F'){jump();bool flag=ps[p].cost(this,'D'); //闪 return true;} }else if(type=='F'){if(ps[p].type=='M'||ps[p].jumpType=='Z'){jump();bool flag=ps[p].cost(this,'D'); //闪 return true;}} //cout<<"未成功使用杀"<<endl; return false;
}bool Pig::useF() {  //使用决斗 // TODO: 补全代码//cout<<this->type<<this->index<<endl;Pig* attack=this;if(type=='M') //主猪 {for (Pig* next = getNextPig(); next != this; next = next->getNextPig()){if(next->jumpType=='F'){jump();bool flag=next->findJ(this);if(flag==0) //求无懈可击失败 {Pig* now=this;while(1) {if(now==this){now=next;  //转到对方 if(next->type=='Z') //是忠猪,面对主猪,不会弃置杀,直接减血 {next->hurt(this); break;} else if(next->type=='F')//是反猪,不遗余力弃置杀 {bool judge=next->cost(this,'K'); if(judge==0) break;}}else if(now==next){now=this;  //转到我方,主猪不遗余力弃置杀 bool judge=this->cost(next,'K'); if(judge==0) break;}}}return true; }}for (Pig* next = getNextPig(); next != this; next = next->getNextPig()){if(next->jumpType=='f'){jump();bool flag=next->findJ(this);if(flag==0) //求无懈可击失败 {Pig* now=this;while(1) {if(now==this){now=next;  //转到对方 if(next->type=='Z') //是忠猪,面对主猪,不会弃置杀,直接减血 {next->hurt(this); break;} else if(next->type=='F')//是反猪,不遗余力弃置杀 {bool judge=next->cost(this,'K'); if(judge==0) break;}}else if(now==next){now=this;  //转到我方,主猪不遗余力弃置杀 bool judge=this->cost(next,'K'); if(judge==0) break;}}}return true; }}}else if(type=='Z') //忠猪 {for (Pig* next = getNextPig(); next != this; next = next->getNextPig()){if(next->jumpType=='F'){jump();bool flag=next->findJ(this);if(flag==0) //求无懈可击失败 {Pig* now=this;while(1) {if(now==this){now=next;  //转到对方,是反猪,不遗余力弃置杀 bool judge=next->cost(this,'K'); if(judge==0) break;}else if(now==next){now=this;  //转到我方,忠猪不遗余力弃置杀 bool judge=this->cost(next,'K'); if(judge==0) break;}}}return true; }}}else if(type=='F'){//对主猪表敌意jump();bool flag=ps[0].findJ(this);if(flag==0) //对方求无懈可击失败 {Pig* now=this;while(1) {if(now==this){now=ps;  //转到对方,是主猪,不遗余力弃置杀 bool judge=now->cost(this,'K'); if(judge==0) break;}else if(now==ps){now=this;  //转到我方,反猪不遗余力弃置杀 bool judge=this->cost(ps,'K'); if(judge==0) break;}}}return true; } //cout<<"未成功使用决斗"<<endl; return false;
}bool Pig::useN() {// 主动使用南猪入侵, 满足使用条件就使用, 使用后返回true//cout<<this->type<<endl;for (Pig* next = getNextPig(); next != this; next = next->getNextPig()) {// TODO: 补全代码//jump();bool flag=next->findJ(this);//if(flag==1) break;if(flag==0)//求无懈可击失败 {bool judge=next->cost(this,'K');if(judge==0&&next->type=='M'&&this->jumpType==0)//是主猪,且受到伤害,且本猪没有跳身份 {//cout<<"主猪认为它是类反猪"<<endl; this->jumpType='f';//主猪会认为「没有跳身份,且用南猪入侵对自己造成伤害的猪」是类反猪     } }//cout<<next->hp<<endl;}return true;
}bool Pig::useW() {//cout<<this->type<<this->index<<endl;for (Pig* next = getNextPig(); next != this; next = next->getNextPig()) {// TODO: 补全代码//jump();bool flag=next->findJ(this);//if(flag==1) break;if(flag==0)//求无懈可击失败 {bool judge=next->cost(this,'D');if(judge==0&&next->type=='M'&&this->jumpType==0)//是主猪,且受到伤害,且本猪没有跳身份 {//cout<<"主猪认为它是类反猪"<<endl; this->jumpType='f';//主猪会认为「没有跳身份,且用南猪入侵对自己造成伤害的猪」是类反猪        } }//cout<<next->hp<<endl;}return true;
}bool Pig::del(char c) { // 删掉手里一张牌, 删成功则返回true// TODO: 补全代码for(list<char>::iterator i=cards.begin();i!=cards.end();i++){if((*i)==c){cards.erase(i);return true;}}return false;
}

山大程序设计思维与实践 六月模拟:猪国杀相关推荐

  1. 山东大学程序设计思维与实践 四月模拟:TT与可怜的猫

    4月模拟-TT与可怜的猫 程序设计思维实践-复杂模拟题训练2 山东大学计算机科学与技术学院程序设计思维与实践 sdu程序设计思维与实践 山东大学程序设计思维实践作业 山大程序设计思维实践 山东大学程序 ...

  2. 程序设计思维与实践 Month3 模拟

    文章目录 CSP 201609-3 炉石传说 1. 问题描述 2. 思路历程 3. 具体实现 4. 代码 CSP 201609-3 炉石传说 1. 问题描述 游戏在一个战斗棋盘上进行,由两名玩家轮流进 ...

  3. 程序设计思维与实践月模拟题X3

    这里写目录标题 201604-3 路径解析 题目 思路 代码 201609-3 炉石传说 题目 思路 代码 201809-3 元素选择器 题目 思路 代码 201604-3 路径解析 题目 在操作系统 ...

  4. 程序设计思维与实践 月模拟题3 Blog

    CSP-201609-3炉石传说 题目具体描述不再粘贴,如有需要可参照CSP模拟考试网址. CSP模拟考试网址 题目分析 首先构建结构体role用来保存英雄/随从,包含生命值和攻击力两个变量,这样两名 ...

  5. 山东大学计算机科学与技术学院程序设计思维与实践作业 week10-树型数据结构及其应用

    山东大学计算机科学与技术学院程序设计思维与实践作业 山大程序设计思维与实践作业 sdu程序设计思维与实践 山东大学程序设计思维实践作业H10 山大程序设计思维实践作业H10 山东大学程序设计思维与实践 ...

  6. 山东大学计算机科学与技术学院程序设计思维与实践作业 week5-数学基础与线性结构

    山东大学计算机科学与技术学院程序设计思维与实践作业 山大程序设计思维与实践作业 sdu程序设计思维与实践 山东大学程序设计思维实践作业H5 山大程序设计思维实践作业H5 山东大学程序设计思维与实践 w ...

  7. 程序设计思维与实践 Week9 作业三道

    A - 咕咕东的目录管理器 题面 咕咕东的雪梨电脑的操作系统在上个月受到宇宙射线的影响,时不时发生故障,他受不了了,想要写一个高效易用零bug的操作系统 -- 这工程量太大了,所以他定了一个小目标,从 ...

  8. 【模拟】【bzoj1972】【SDOI2010】猪国杀

    1972:[SDOI2010]猪国杀 [题目描述] <猪国杀>是一种多猪牌类回合制游戏,一共有三种角色:主猪,忠猪,反猪.每局游戏主猪有且只有一只,忠猪和反猪可以有多只,每只猪扮演一种角色 ...

  9. 程序设计思维与实践 Week14 限时大模拟A - 猫睡觉问题

    题意 众所周知,TT家里有一只魔法喵.这只喵十分嗜睡.一睡就没有白天黑夜.喵喵一天可以睡多次!!每次想睡多久就睡多久╭(╯^╰)╮ 喵睡觉的时段是连续的,即一旦喵喵开始睡觉了,就不能被打扰,不然喵会咬 ...

最新文章

  1. 都996了,需求还是没法按时交付,怎么办?
  2. ubuntu apt-get彻底卸载软件包
  3. 样式文件修改后不起作用_Word样式,这个功能好用到让你忘不了!
  4. nginx: [error] invalid PID number in /usr/local/webserver/nginx/logs/nginx.pid
  5. python最小值函数_Python3 min() 函数详解 获取多个参数或列表中的最小值
  6. 图像抠图Image Matting算法调研
  7. 送福利 | 送书5本《ASP.NET Core项目开发实战入门》带你走进ASP.NET Core开发
  8. uwsgi搭配nginx
  9. 实战经验:Oracle Lost Write Detection机制导致Select产生大量Redo
  10. 好企业:不是走得多快而是走得多稳
  11. android 动画间隔时间,Android使用View Animation实现动画加载界面
  12. 举个栗子看如何做MySQL 内核深度优化 1
  13. Java NIO学习与记录(七): Reactor单线程模型的实现
  14. 高通骁龙888开始被Linux内核5.12版正式支持
  15. Shared_ptr循环引用解决(weak_ptr的作用)
  16. xml格式化 java_Java XML格式化程序
  17. python-快乐数
  18. 工程技术人员以计算机为辅助工具,上海工程技术大学机械CADCAM考试复习资料
  19. 条例、办法、规定和实施细则有什么区别
  20. Windos 系统安装 Themebeta Chrome主题

热门文章

  1. SIGTERM、SIGKILL、SIGINT和SIGQUIT的区别
  2. ubuntu1804开启图形化界面
  3. 手机app图标显示为机器人或者不显示的解决办法
  4. MATLAB中MVDR谱估计式,基于Welch算法的功率谱估计的实现
  5. 主板地和外壳接地_使用安全外壳和安全副本
  6. 「智头条」智能家居企业扎堆IPO:欧瑞博重启IPO,凯迪仕、立林启动IPO;魅族新专利可无感匹配智能家居
  7. 关于STL中iota()函数的使用
  8. golang之iota常量与枚举标识
  9. java环境配置https访问(本地测试)
  10. PyCharm2019.1.3的安装教程