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(|a−b|,n−|a−b|)min(|a−b|,n−|a−b|),所以就是dis+(b的+马)<=(a的-马)+1是否成立。
当然,因为自己不能杀自己,所以还需要注意判断ab是否相等。
在判断是什么操作的时候可能会出现不知道是字符还是数字,这个时候只需要统一读取字符串,然后再看是否需要把字符串转化为数字即可。
注意:注意用字符串存储输入的:i,p,h。千万别用一个字符存储,因为可能是两位数。(粑粑被坑死了,我是zz)
#include
#include
#include
#include
#include
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 {
len1=d[j]-'0';
s1=s1+len1*pow(10,strlen(d)-j-1);
}
for(j=0;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 {
len1=c[j]-'0';
s1=s1+len1*pow(10,strlen(c)-j-1);
}
for(j=0;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;
}