A.2021bttcacm*N
题目描述
欢迎参加第七届包头师范学院大学生程序设计竞赛!请各位亲积极编程,争取解决更多问题,为你的学院和班级争光!加油吧!
这个题目很简单,输入一个正整数n,然后输出n次BTTCACM即可。
输入格式
输入一个正整数n。1<=n<=1000。
输出格式
输出n次BTTCACM,每次输出后需要回车换行。详见样例。
输入样例
3
输出样例
BTTCACM
BTTCACM
BTTCACM
代码:
#include<iostream>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
while(n--)
cout<<"BTTCACM"<<endl;
}
return 0;
}
B.2021职业选手
【职业选手】
小Z学长最近沉迷各种PVP(Player Vs Player,玩家对玩家)网络游戏,小Z学长简直就要气炸了!
为什么会这么说呢?原来对面的玩家仿佛是职业选手,小Z同学觉得自己安全的时候,对面的玩家一通操作就把小Z同学送回了老家,哦天哪!小Z同学只能望着黑白的画面长叹,这就是职业选手吗?
那么职业选手为什么能够精准的算出伤害从而击杀小Z学长呢?说到底还是因为小Z学长对数值不够敏感!
游戏内共有血量,攻击力,防御力,额外伤害,暴击期望 五种数值。而当伤害达到或超过对方的血量时,我们就称对方到达了“斩杀线”,只要会算伤害,就知道对方能不能斩杀你,你能不能斩杀对面。
那么伤害要如何计算呢?在这里我们采用如下计算方法:
攻击力 * 暴击期望 + 额外伤害 就是玩家所能打出的伤害,而敌人的防御力则呈现百分比的形式将伤害扣除。
在这个算式下得出的伤害就是玩家的最终伤害,伤害值达到或高过血量就是进入了“斩杀线”。
现在小Z学长知道自己的血量、攻击力、防御力、额外伤害、暴击期望五项数值,而他也同样知道对方的这五样数值,他想知道两个人谁会胜利! 。
输入格式
输入共两行,
第一行是小Z学长的血量HP、攻击力ATK、防御力DEF、额外伤害DMG、暴击期望Crit,其中DEF是不超过100的整数代表防御的百分比。
第二行是敌方的血量HP、攻击力ATK、防御力DEF、额外伤害DMG、暴击期望Crit,其中DEF是不超过100的整数代表防御的百分比。
输出格式
如果双方都不在斩杀线内, 请输出 easy farm.
如果小Z学长在对方的斩杀线内,但是对方不在小Z斩杀线内,请输出 where is my teammate?
如果敌方在小Z学长的斩杀线内, 但是小Z不在小Z斩杀线内,请输出 Your Soul Is Mine~
如果双方都在彼此的斩杀线内, 请输出 wo neng fan sha!
输出答案后回车换行。
输入样例
9999 9999 0 9999 9999
9999 0 0 0 0
输出样例
Your Soul Is Mine~
数据范围与提示
题目中不存在特大数据
题目分析:
通过题意可知,小Z学长和敌方造成的伤害为攻击力 * 暴击期望 + 额外伤害 。而承受的实际伤害为以百分比形式防御对方造成的伤害,即injured= 对方的(攻击力 * 暴击期望 + 额外伤害 )*(100-自己的防御力)*0.01(此处为百分比形式,所以乘0.01转化为实际值)。
如果对方造成的injured大于等于自己的血量,即到了斩杀线。
代码:
#include<bits/stdc++.h>
using namespace std;
/// 0 1 2 3 4
/// 血量 攻击力 防御力 额外伤害 暴击期望
int main()
{
double a[5],b[5];
for(int i=0;i<5;i++)
cin>>a[i];
for(int i=0;i<5;i++)
cin>>b[i];
int mark1=0,mark2=0;///判断两人是否在斩杀线
///injured=对方的(攻击力 * 暴击期望 + 额外伤害 )*(100-自己的防御力)*0.01
double injureda=(a[1]*a[4]+a[3])*(100-b[2])*0.01;
double injuredb=(b[1]*b[4]+b[3])*(100-a[2])*0.01;
if(injureda>=b[0])
mark2=1;///敌方在斩杀线
if(injuredb>=a[0])
mark1=1;///小Z在斩杀线
if(mark1==0&&mark2==0)
cout<<"easy farm."<<endl;
else if(mark1==0&&mark2==1)
cout<<"Your Soul Is Mine~"<<endl;
else if(mark1==1&&mark2==0)
cout<<"where is my teammate?"<<endl;
else
cout<<"wo neng fan sha!"<<endl;
return 0;
}
C.2021十五日的救赎
【十五日的救赎】
终于到了十五日了,每个月的十五日,正是对于小Z学长的救赎——从名为的氪金的地狱当中,被救赎的花呗~
就像每个月的十五日不一定就是第十五日一样,小Z学长玩的手游网络游戏也不一定就必须要氪金,但是不氪金哪里来的韭菜呢?为了表达自己是一个合格的韭菜,小Z学长每个月都会在自己游玩的手游网络游戏中氪金!
氪金价位分各种优惠额度,是这么计算的:
标注为原价的6元普通礼包:1颗宝石
标注为特卖的30元限定礼包:5颗宝石
标注为限时优惠的98元优惠礼包:15颗宝石
标注为超值的198元超值大礼包:30颗钻石
标注为限购一次的298元尊享礼包:45颗宝石
标注为VIP12解锁的648元终极礼包:100颗宝石
怎么样,只要10颗宝石就能抽一次十连抽呢!而且大约200抽就能必出一个小Z学长想要的东西,真是太划算啦!!!
现在小Z学长知道自己需要多少颗宝石去抽保底了,但是他想知道自己最少要花多少钱才能买齐N个宝石呢,请你告诉他吧!
而在这其中,648作为一个消费的门槛,被小Z学长亲切的称为“单”!如果消费每满足648一次,就称为“一单”!小Z学长还想知道自己需要多少单!
输出格式
输出内容的第一行是一个数,代表小Z学长的最少花费。
如果小Z学长的消费超过了648元,输出的第二行是一个数和一个字符串"dan",代表小Z学长共消费了多少单。
比如输入数据为648的情况下第二行的输出则为1dan。
输出数据后回车换行。
输入样例
2
输出样例
12
数据范围与提示
样例数据中,小Z学长只买6元的礼包是最优情况,如果买30元的礼包一样可以满足情况,但是花费的钱会更多。
题目分析:
通过题意可知,要找出买N个宝石花费最少的情况。
通过分析题目我们可以知道
标注为原价的6元普通礼包:1颗宝石 (单价为6元/1颗)
标注为特卖的30元限定礼包:5颗宝石 (单价为6元/1颗)
标注为限时优惠的98元优惠礼包:15颗宝石 (单价为6.5元/1颗)
标注为超值的198元超值大礼包:30颗钻石 (单价为6.6元/1颗)
标注为限购一次的298元尊享礼包:45颗宝石 (单价为6.62元/1颗)
标注为VIP12解锁的648元终极礼包:100颗宝石 (单价为6.48元/1颗)
所以!最优情况就是6元/1颗的情况
最后加上超过648的情况即可
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
int sum=0;
sum=n*6;
cout<<sum<<endl;
if(sum>648)
{
cout<<sum/648<<"dan"<<endl;
}
}
}
D.2021步履蹒跚
【步履蹒跚】
小Z学长睡觉总喜欢漏半条腿,这下可好,今天的风那叫一个大啊,直接给小Z学长整抽筋了!
太恐怖了,本来平时小Z学长都是先迈左腿走路的,结果现在左腿抽筋了只能先迈右腿走路了!本来小Z学长都是先左腿支地起床的现在只能右腿支地起床了!本来小Z学长是先左脚迈入公司大门的今天是右脚结果被开除了!真是令人潸然泪下的编造故事......
虽然故事是虚造的,但对于小Z学长来说,所谓的抵达是一种定义,小Z学长一旦被人要求抵达的话,那他就一定会迈步到终点。哪怕会因为右脚先迈入公司被开除...
虽然小Z学长不会因为右脚先迈入公司被开除,但是小Z学长还是十分在意走路的效率的,毕竟腿脚不方便,
如果小Z学长有什么要走到的地方,那他会用最快的方式行进。
现在小Z学长的左脚因为抽筋的缘故,只能一次性迈一小步(1M), 或者一大步(7M),
而右脚可以正常走路,为了考虑左脚的感受,右脚只能迈出 4M 以内的距离,可以是0.2M,也可以是1.4M。
现在小Z学长想知道步履蹒跚的自己去往一个地方的话,他需要最少走多少步才能抵达目标地点呢?
如果超过10000步可就对小Z学长来说太远啦,他会回复你一句 .Gei Wo QIAN ma?,可能这就是傲娇吧。
当然,小Z学长其实没有什么强迫症,他不会纠结一种概念: 在一种定义当中,如果要把事物的逻辑抽象成数字符号的语言定义的话,他不会要把他强行等价成对应的符号,只需要事物的处理逻辑本身完成即可。
换句话说,也就是在面对未知的挑战时,他不会要求做到尽善尽美,而是会选择“能够完成”的地步就可以满足了。
比如在处理到达的逻辑时,他就不会把它等价为数据逻辑当中的相等符号,而是“能够到达就可以”的逻辑妥协,最后处理为其他数学符号。
你说这是懈怠还是处事圆滑呢?我们尚且不得而知,重要的是结果OK就好......
输入格式
一行整数数字 N,代表终点距小Z学长的距离。
输出格式
输出的第一行是一个整数步数,代表小Z学长最少需要多少步才可以抵达终点。
如果超过10000,补充输出的第二行则是 .Gei Wo QIAN ma?
输出数据后输出回车换行。
输入样例
12
输出样例
3
数据范围与提示
N的取值范围是[ 0, ]
样例数据中,4+7+1 = 12,一共需要三步。
题目分析:
题目重点:1.先迈右腿
2.右脚最多迈出4m
3.左脚可以迈出1m或7m
4.要最快的方式
5.如果超过10000步要输出一句 .Gei Wo QIAN ma?
结合1,2,3,4可知,每次迈出一步,右腿为4m,左腿为7m,且先4后7
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long n;
while(cin>>n)
{
long long ans=0;
if(n>11)
{
ans+=(n/11)*2;
n%=11;
}
while(n)
{
n-=4;
ans++;
if(n<=0)
break;
n-=7;
ans++;
if(n<=0)
break;
}
cout<<ans<<endl;
if(ans>10000)
cout<<".Gei Wo QIAN ma?"<<endl;
}
return 0;
}
H.2021真正的伙伴
【真正的伙伴】
小Z学长很久以前了一个竞赛团队,那时他的编程等级是全小队最高的,但没过多久,小队中的成员便一个个都等级提升、赶超了上来。
本来团队壮大是一件好事,但是现在团队的贤者提出了一个观点:“小Z学长,你现在的实力到底如何呢?是不但实力在平均线以下,更是你的实力排名已经在队伍的末尾了吧!你不是我们真正的伙伴!”
糟了!如果这样下去,小Z学长因为不是真正的伙伴,就要被逐出竞赛小队去边境展开咸鱼生活了!现在小Z学长想知道,自己到底是不是真正的伙伴!!!
输入格式
输入的第一行是一个正整数N和一个数字SCORE,代表竞赛小队一共有多少人,以及小Z学长的实力水平。 接下来的N-1行每行一个数字,代表小队其他成员的实力水平。
题目数据保证 N >= 3
输出格式
输出共一行,分四种具体情况。
如果小Z学长是"真正的伙伴"(分数在平均线及以上,且不在倒数三名之内), 请输出 EZ
如果小Z学长的实力水平在平均数水平以下,但是不在倒数三名之内, 请输出 you so weak.
如果小Z学长的排名在倒数三名之内,但是分数在平均线及以上, 请输出 are you serious?
如果“真正的伙伴”两个条件都不满足(也即排在后三名,且分数低于平均分), 请输出 W0 GUN!!!
输出答案后,回车换行。
输入样例
4 4
1
2
3
输出样例
EZ
数据范围与提示
题目保证竞赛小队中没有实力相差小于0.000000001的人
题目分析:
通过数据范围与提示可知,没有任意两人水平相等。所以可以直接用数组排序,判断即可知。另外,题目中并没有说水平是整数。所以需要用浮点数。
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
double a[1005];
double s;
while(cin>>n>>s)
{
double sum=s;
a[0]=s;
for(int i=1;i<n;i++)
{
cin>>a[i];
sum+=a[i];
}
sort(a,a+n);
int mark=0;
for(int i=0;i<n;i++)
{
if(a[i]==s)
mark=i+1;
}
sum=sum/n;
if(s>=sum&&mark>3)
cout<<"EZ"<<endl;
else if(s<sum&&mark>3)
cout<<"you so weak."<<endl;
else if(s>=sum&&mark<=3)
cout<<"are you serious?"<<endl;
else if(s<sum&&mark<=3)
cout<<"W0 GUN!!!"<<endl;
}
return 0;
}
I.2021齿轮
题目描述
白崴学长购买新机器,由于不合理,有很多冗余的齿轮。
整个机器由一个连在电动机上的大齿轮驱动,这个齿轮被安装在位置(0,0)。
白崴学长希望知道,在这个机器启动后,最后转动起来的齿轮是哪一个。
白崴学长详尽地记录了所有N (2 <= N <= 1080)个齿轮的位置 xi, yi (-5,000 <= xi <= 5,000; -5,000 <= yi <= 5,000)和半径ri (3 <= ri <= 1024)。
你的任务是,找出整个传动系统末端的齿轮(一个被其他齿轮带动,但没有带动其他任何装置的齿轮)的位置。
除了驱动整个机器的大齿轮,其他齿轮都只会被另一个齿轮带动。
输入格式
第1行: 1个整数N
第2~N+1行: 第i+1行给出了齿轮i的参数:xi,yi,以及ri
输出格式
第1行: 输出2个用空格隔开的整数x,y,表示传动系统末端齿轮的位置
输入样例
3
0 0 30
30 40 20
-15 100 55
输出样例
-15 100
数据范围与提示
机器中一共有3个齿轮。第一个齿轮被放在原点,半径为30。它带动了位于(30,40)的半径为20的齿轮,于是位置为(-15,100)的半径为55的齿轮最终被第二个齿轮带动。
题目分析:
通过题意可知,除了(0,0)点的齿轮,每一个齿轮都会被另一个带动,而且每一个齿轮最多也只会带动一个。此题我用深搜解,从(0,0)点开始,每一个给编号,编号为n的就是末端的齿轮。
判断齿轮是否带动的条件即两个圆是否相切。即两圆点距离等于两圆半径之和。
代码:
#include<bits/stdc++.h>
using namespace std;
int n;
struct circle
{
int x;
int y;
int r;
int num;///编号
}temp[1085];
int mark[1085];
int ans;
void dfs(int k)
{
if(temp[k].num==n)
{
ans=k;
return ;
}
for(int i=0;i<n;i++)
{
if(mark[i]==0)
{
double d=sqrt(pow(temp[i].x-temp[k].x,2)+pow(temp[i].y-temp[k].y,2));
if(d==temp[i].r+temp[k].r)
{
mark[i]=1;
temp[i].num=temp[k].num+1;
dfs(i);
}
}
}
}
int main()
{
while(cin>>n)
{
for(int i=0;i<n;i++)
{
cin>>temp[i].x>>temp[i].y>>temp[i].r;
temp[i].num=0;
}
memset(mark,0,sizeof(mark));
for(int i=0;i<n;i++)
{
if(temp[i].x==0&&temp[i].y==0)
{
mark[i]=1;
temp[i].num=1;
dfs(i);
}
}
cout<<temp[ans].x<<" "<<temp[ans].y<<endl;
}
return 0;
}
K.2021 单据录入
题目描述
【单据录入】
踏上旅途的小Z同学游历四方,终于得到了他一展身手的机会!小Z找到了一个公司,他终于可以在这里释放他的代码能量,将单据录入到系统当中啦!
公司会先输入“type”,提供给他一组单据字段,一组字段由两个字符串组成,第一个字段是单据的实体类名字段,第二个字段是单据的代码名称,如“水果 fruit”,就代表我们可以用fruit来录入水果信息!
在那之后,公司还会输入“input”,代表已经提供了所有的单据字段,要开始录入具体的单据信息了!
同样是一组由两个字符串组成,第一个字段是单据的代码名称,第二个字段是单据的具体录入信息!
如果单据中已经拥有具体录入信息的话,因为客户没有购买相对应的版本迭代功能,我们会把具体的录入信息覆盖!
当然,因为公司的录入人有可能会因为粗心漏掉某些单据,请不要忘了把他们把"null"补充上哦!
最后,公司会输入一个字符串"end"结束单据的录入,最后特别要注意,不是所有员工都会注意编码守则,因此会有将命令当作字段使用的人存在哦......
输入格式
第一行是一个单独的 type,代表开始录入单据字段信息。
接下来的n行,每行由两个字符串组成,中间由空格分隔,第一个字符串是单据的实体类名字段,第二个字符串是单据的代码名称。
接下来一行是一个单独的 input,代表开始录入单据具体数据信息。
接下来的m行,每行由两个字符串组成,第一个字符串是与单据的代码名称,第二个字符串是单据的具体录入信息。
最后一行单独的”end",代表录入信息结束。
n和m不会超过1000000
输出格式
输出一共有n行,每行由两个字符串组成,字符串中间以 ":" 分开。
第一个字符串是单据的字段类名,第二个字符串是单据的具体信息。
每条数据输出之后回车换行,详见样例数据。
输入样例
type
peach p
apple a
bed b
input
a 20211125
p 20211126
end
输出样例
peach:20211125
apple:20211126
bed:null
数据范围与提示
题目保证 type 中同一个实体类名字段只会出现一次,单据的代码名称不会重复。
如果感觉代码正确但依旧错误的话,请仔细查看描述哦...
题目分析:
当输入的字符串为type时,开始读入数据,每个字符串由两个字符串组成。但是因为无法排除这两个字符串与题目中type,input,end重名的可能。所以需要用getline进行输入。
#include<bits/stdc++.h>
using namespace std;
struct temp
{
string name;
string newname;
string num;
}temp[1005];
int main()
{
int k=0;
string str;
int mark=0;
string str1,str2;
while(getline(cin,str))
{
if(str=="type")
{
continue;
}
else if(str=="input")
{
mark=1;
}
else if(str=="end")
{
break;
}
else
{
if(mark==0)
{
str1=str.substr(0,str.find(" ",0));
str2=str.substr(str.find(" ",0)+1,str.size());
//cout<<str1<<" "<<str2<<endl;
temp[k].name=str1;
temp[k].newname=str2;
temp[k].num="null";
k++;
}
else
{
str1=str.substr(0,str.find(" ",0));
str2=str.substr(str.find(" ",0)+1,str.size());
for(int i=0;i<k;i++)
{
if(str1==temp[i].newname)
temp[i].num=str2;
}
}
}
}
for(int i=0;i<k;i++)
{
cout<<temp[i].name<<":"<<temp[i].num<<endl;
}
return 0;
}
L.2021鱿鱼游戏
题目描述
【鱿鱼游戏】
应该有很多同学都看过《鱿鱼游戏》吧?即使没有看过,相信爱刷抖音的小伙伴们也应该在抖音上刷到过,这是一部最近比较火的一部韩剧,《鱿鱼游戏》主要讲述一群走投无路并急需金钱的人收到神秘邀请,邀请他们共同加入一场游戏。
为了赢取 456 亿韩元奖金,背景各异的 456 名参赛者被关在秘密场所进行游戏。每一轮游戏都是韩国人小时候就会玩的传统游戏,如一二三木头人,但闯关失败的后果则是死亡。
周学长追这部剧追疯了,他甚至做梦都梦见了自己加入了鱿鱼游戏,他梦见在一个关卡中,所有人被红衣人两两分为了一组,现在每组人的面前都放了两筐纸条,这两筐内的纸条都是一样的,每张纸条上都写了10位数字,现在游戏规则是要求组内的两个人在2分钟内从各自的筐中选出一张纸条,最后谁的纸条上的数字递增子序列长谁就获胜,如果一样长则组内两人都闯关成功,在这轮游戏中周学长和赵学长被分到了一组,现在如果你是裁判请你判断下谁会闯关成功。
输入格式
共n组数据,每组两行 第一行是周学长纸条上的一串数字 第二行是赵学长纸条上的一串数字 (数字范围0~9)。
输出格式
如果闯关成功的是周学长 输出:zhou
如果闯关成功的是赵学长 输出:zhao
如果两位都闯关成功 输出: all
输入样例
3
0123456789
0123456789
0001230045
0000000123
9999999999
0300000000
输出样例
all
zhou
zhao
题目分析:
通过题意可知,本题求的是最长递增子序列,即可用动态规划求解。
而要用动规求解,就要知道dp数组里存的是什么?
dp[ i ]里存的是以num[ i ] 为结尾的最长递增子序列长度。
具体看图:
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
while(n--)
{
string str1,str2;
int dp1[15]={0},dp2[15]={0};
cin>>str1>>str2;
int mark1=0,mark2=0;
for(int i=0; i<10; i++)
{
dp1[i]=1;
for(int j=0; j<i; j++)
{
if(str1[i]>str1[j]&&dp1[j]+1>dp1[i])
dp1[i]=dp1[j]+1;
}
mark1=max(mark1,dp1[i]);
}
for(int i=0; i<10; i++)
{
dp2[i]=1;
for(int j=0; j<i; j++)
{
if(str2[i]>str2[j]&&dp2[j]+1>dp2[i])
dp2[i]=dp2[j]+1;
}
mark2=max(mark2,dp2[i]);
}
if(mark1==mark2)
cout<<"all"<<endl;
else if(mark1>mark2)
cout<<"zhou"<<endl;
else
cout<<"zhao"<<endl;
}
}
return 0;
}
M.2021街溜子老Z
题目描述
街溜子老Z有一个失散多年的在南方搞工程的好大哥,最近老Z也没事干,打算从他的所在地去找他的好大哥一起搞搞工程,老Z这个人也没什么爱好,可能除了爱吹牛就是爱溜达了,老Z从小就在小镇里待着,也没见过什么世面,所以这次出行他打算在去往南方的途中多溜达几个5A级的景区,但是路上有好多5A景区,去找大哥的路也不止一条,他现在想知道在找好大哥的路途中,怎么走才能溜达最多的5A级景区,聪明绝顶的你能帮帮他么?
输入格式
第一行三个正整数 N,S,E,分别表示城市的个数,老Z所在城市,好大哥所在城市;
第二行 N 个正整数 K,表示每个城市拥有的 5A 级景区个数;
接下来的 N-1 行,每行有两个正整数 A,B,表示能从 A 城市到达 B 城市。
输出格式
输出老 Z 最多能溜达多少个景点,如果从老 Z 不能到达好大哥所在的城市,则输出 -1 表示遗憾。输出答案后回车换行。
输入样例
5 1 3
1 5 1 2 2
1 2
2 3
3 4
1 4
输出样例
7
数据范围与提示
数据范围: 1 <= N <= 1000, 1 <= K <= 20000, 1<= A, B, S, E <= N
题目分析:
通过题目可知,每个城市都有一定数量的5A景区,需要求解从X城市(即老Z所在城市)到Y城市(即好大哥所在城市)经过的城市最多能经过多少个景区。
解题思路:
用vector 数组存A城市与B城市相通,当遇到X城市时进入搜索,搜索能经过的城市,在过程中取最大值。
代码:
#include<bits/stdc++.h>
using namespace std;
int n,x,y,a,b;
int value[1055];
int mark[1055];
vector < pair<int ,int> > vec;///定义一个数组用来存城市A与城市B相连
int ans=0;
int sum=0;
int flag=0;
void dfs(int k)
{
if(vec[k].second==y)///DFS出口为B城市是Y城市
{
flag=1;
ans=max(ans,sum);///比较取最大值
return ;
}
for(int i=0;i<vec.size();i++)
{
if(mark[i]==0&&vec[i].first==vec[k].second)///数组第i个的A城市是第K个的B城市 继续搜索
{
mark[i]=1;
sum+=value[vec[i].first];
dfs(i);
sum-=value[vec[i].first];
mark[i]=0;
}
}
}
int main()
{
while(cin>>n>>x>>y)
{
for(int i=1;i<=n;i++)
cin>>value[i];
ans=value[x]+value[y];///用来存结果
sum=value[x]+value[y];///存每一个可行的方案对应的答案
n--;
flag=0;
while(n--)
{
cin>>a>>b;
vec.push_back( {a,b} );
}
for(int i=0;i!=vec.size();i++)
{
//cout<<vec[i].first<<" "<<vec[i].second<<endl;
if(vec[i].first==x)///如果数组里的A城市是X城市 进入DFS
{
mark[i]=1;
dfs(i);
mark[i]=0;
}
}
if(flag!=0)
cout<<ans<<endl;
else
cout<<-1<<endl;
}
return 0;
}