BNU 三国杀

  《三国杀》是一款热门的桌上游戏,融合了西方类似游戏的特点,并结合中国三国时期背景,以身份为线索,以卡牌为形式,集合历史、文学、美术等元素于一身。
       相信很多人都玩过这款游戏,在此只对此问题做简单介绍:
       【杀】
       出牌阶段,攻击范围内对除自己以外的一名角色使用,效果是对该角色造成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;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值