《三国杀》是一款热门的桌上游戏,融合了西方类似游戏的特点,并结合中国三国时期背景,以身份为线索,以卡牌为形式,集合历史、文学、美术等元素于一身。
相信很多人都玩过这款游戏,在此只对此问题做简单介绍:
【杀】
出牌阶段,攻击范围内对除自己以外的一名角色使用,效果是对该角色造成1点伤害。
攻击范围是1。(当计算距离 D ≤ 1 时,可以使用【杀】)
【马】
- Num 【马】
当该角色出【杀】计算与其他角色的距离时,始终 - Num。(可以理解为一种进攻上的优势)。
+ Num 【马】
当其他角色出【杀】计算与该角色距离时,始终 + Num。(可以理解为一种防御上的优势)。
(一角色最多装备一匹 - Num1 【马】 和 最多一匹 + Num2 【马】,可同时装备两种马。此处Num1 与 Num2 无关)
由于《三国杀》理论上来说是可以没有人数限制的,所以你叫了 N 个人一起来玩,大家坐成了一圈,逆时针依次编号 1到 N,现给出M 个操作,每个操作是以下两种之一:
"N1 S Num"——表示编号为N1 的玩家将要装备或替换一张【马】。
S 为 "+" 或 "-" ;
"K A B" ——表示A对B使用一张【杀】询问A 能否杀到B 。
能则输出 "Yes!" ,否则输出 "I'm sorry." 。
如图,赵云装备有一张 +1 【马】。
此时,赵云杀关羽时距离 D = 1 。而关羽想杀赵云时距离 D = 2 。
Input
第一行为T(1 ≤ T ≤ 10),表示测试数据组数。
每组数据第一行为两个整数N,M 。(2 ≤ N ≤ 1000 ,1 ≤ M ≤ 1000)
接下来有M 行,每一行格式为
"N1 S Num" (1 ≤ N1 ≤ N , S 为 "+" 或 "-" ,1 ≤ Num ≤ 100,N1和Num均为整数)
或 "K A B" (1 ≤ A,B ≤ N,A ≠ B,A、B都是整数)
假定游戏中无人阵亡。
Output
对于为每组数据,先输出一行 "Case #C:",C 对应数据组数,C 从1 到 T 。
对于每一个格式为 "K A B" 的操作,则输出 "Yes!" 或 "I'm sorry." 。
每组数据之后有一个空行。
Sample Input
2
3 1
K 1 3
5 4
K 1 3
K 1 2
1 - 1
K 1 4
Sample Output
Case #1:
Yes!
Case #2:
I'm sorry.
Yes!
Yes!
此题我只能用无语来表达我的心情了 !!一道简单地模拟题,理论上是很容易过的,不过此oj实在是变态!!
字符转化为数字,是给判错的,用atoi瞬间就过了...花费我好长时间检查bug。现在贴ac代码。
#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<cmath>
using namespace std;
#define abs(x) ((x)<0?0-(x):(x))
int min(int a,int b){return a<b?a:b;}
int main()
{
int T,i,j,n,hash1[1010],hash2[1010],tt=1,m,a,b,x;
char str[3];
cin>>T;
while(T--)
{
printf("Case #%d:\n",tt++);
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++){
hash1[i]=0;
hash2[i]=0;
}
while(m--)
{
scanf("%s",str);
if(str[0]!='K')
{
b=atoi(str);//将字符串转化为数字
scanf("%s%d",str,&x);
if(str[0]=='-') hash1[b]=x;
else hash2[b]=x;
}
else
{
scanf("%d%d",&a,&b);
//cout<<dis<<" "<<hash1[a]<<endl;
printf(hash1[a]+1>=hash2[b]+min(abs(a-b),n-abs(a-b))?"Yes!\n":"I'm sorry.\n");
}
}
cout<<endl;
}
return 0;
}