hpu 1099: 三国杀 [模拟]

1099: 三国杀 [模拟]

时间限制: 1 Sec  内存限制: 128 MB

题目描述

《三国杀》是一款热门的桌上游戏,该游戏融合了西方类似游戏的特点,并结合中国三国时期背景,以身份为线索,以卡牌为形式,合纵连横,经过一轮一轮的谋略和动作获得最终的胜利。三国杀集合历史、文学、美术等元素于一身,在中国广受欢迎。


为了感受《三国杀》的魅力,KACA分析了游戏的流程。

游戏中的基础攻击卡牌是【杀】(出牌阶段,对攻击范围内除自己以外的一名角色使用,效果是对该角色造成1点伤害。)。

现在KACA假设了一种情况,现在有若干名玩家进行游戏,武将皆为白板,有若干条操作,KACA想知道操作后会产生什么结果。

已知攻击范围默认为1,相邻座位的玩家默认距离为1。

此外还有两种马具:

+h可使当其他角色出【杀】计算与该角色距离时,始终+h。

-h可使当该角色出【杀】计算与其他角色距离时,始终-h。

当然,一个角色最多只能装备一匹-h马和一匹+h马,若已有马具,再次装备同类型则会把之前的马具替换掉。

输入

多组测试数据。

第一行是两个数字n,m(2≤n≤1000,1≤m≤1000)分别代表玩家数量和操作次数。

下面m行有两种形式

1.某个玩家装备了一匹马,i P h(1≤i≤n,P为+或-,h(1≤h≤n)代表该马可提供的距离)

2.询问玩家A能否杀玩家B,K A B(K为一个字符,1≤A,B≤n)

输出

对于每组数据中的每次询问,若玩家A可以对玩家B出杀,则输出“No.# Can”,否则输出“No.# Cann't”,#代表A的编号。

样例输入

5 3
K 1 3
1 - 1
K 1 3

样例输出

No.1 Cann't
No.1 Can


思路:

可以用两个数组来记录位置i的+马和-马。

这样装备的时候可以直接把对应马的距离进行替换。

判断能否进攻就是考虑ab之间的距离与a的-马和b的+马。

ab的距离dis为min(|ab|,n|ab|)min(|a−b|,n−|a−b|),所以就是dis+(b的+马)<=(a的-马)+1是否成立。

当然,因为自己不能杀自己,所以还需要注意判断ab是否相等。

在判断是什么操作的时候可能会出现不知道是字符还是数字,这个时候只需要统一读取字符串,然后再看是否需要把字符串转化为数字即可。

注意:注意用字符串存储输入的:i,p,h。千万别用一个字符存储,因为可能是两位数。(粑粑被坑死了,我是zz)

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int a[1010],b[1010];
char c[110],d[110],e[110];
int main()
{
 int n,m,i;
 while(scanf("%d %d",&n,&m)!=EOF)
 {
  int p1,p2,s1,s2,len1=0,len2=0,j=0;
  memset(a,0,sizeof(a));
  memset(b,0,sizeof(b));
  for(i=1;i<=m;i++)
  {
   s1=0,s2=0;
      getchar();
   scanf("%s %s %s",c,d,e);
   if(c[0]=='K')
   {
    for(j=0;j<strlen(d);j++)
    {
     len1=d[j]-'0';
     s1=s1+len1*pow(10,strlen(d)-j-1);
    }
    for(j=0;j<strlen(e);j++)
    {
     len2=e[j]-'0';
     s2=s2+len2*pow(10,strlen(e)-j-1);
    }
    p1=min(abs(s2-s1),n-abs(s2-s1))+b[s2];
    p2=1+a[s1];
    if(s1==s2)
    {
     printf("No.%d Cann't\n",s1);
    }
    else if(p2>=p1)
    {
     printf("No.%d Can\n",s1);
    }
    else
    {
     printf("No.%d Cann't\n",s1);
    }
   }
   else
   {
    for(j=0;j<strlen(c);j++)
    {
     len1=c[j]-'0';
     s1=s1+len1*pow(10,strlen(c)-j-1);
    }
    for(j=0;j<strlen(e);j++)
    {
     len2=e[j]-'0';
     s2=s2+len2*pow(10,strlen(e)-j-1);
    }
    if(d[0]=='-')
    {
     a[s1]=s2;
    }
    else
    {
     b[s1]=s2;
    }
   }
  }
 }
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值