您的位置:首页 > 其它

HDU 1107 武林(模拟)

2016-07-11 18:01 316 查看
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1107

这题算是挺麻烦的一个模拟了。。wa了一次,发现有句话忘记写了,加上去就过了。纪念一下,写了差不多两个小时。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <ctime>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define pb push_back
#define mp make_pair
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define calm (l+r)>>1
const int INF=2139062143;

inline bool judge(int x,int y){
return x>=1&&x<=12&&y>=1&&y<=12;
}
int step,cnt[3][13][13];
int go[3][2][2]={
{{1,0},{-1,0}},
{{0,1},{0,-1}},
{{1,1},{-1,-1}}
};
struct Man{
int x,y,nowdir;
int hp,mp,atk;
int kind;
double mpnum,atknum;
Man():x(0),y(0),nowdir(0),hp(0),mp(0),atk(0),kind(0),mpnum(0),atknum(0){}
Man(int X,int Y,int HP,int MP,int ATK,int K){
x=X;y=Y;hp=HP;mp=MP;atk=ATK;kind=K;nowdir=0;
if(K==0){mpnum=atknum=0.5;}
else if(K==1){mpnum=0.8;atknum=0.2;}
else if(K==2){mpnum=0.2;atknum=0.8;}
}
void move(){
if(!judge(x+go[kind][nowdir][0],y+go[kind][nowdir][1]))nowdir^=1;
if(!judge(x+go[kind][nowdir][0],y+go[kind][nowdir][1]))return;
cnt[kind][x][y]--;
x+=go[kind][nowdir][0];y+=go[kind][nowdir][1];
cnt[kind][x][y]++;
}
inline int attack(){
return (floor)((mpnum*mp+atknum*atk)*(hp+10)/100);
}
};

vector<Man> man[3];
void init(){
memset(cnt,0,sizeof cnt);
man[0].clear();man[1].clear();man[2].clear();
}

pii findPos(int x,int y,int k){
for(int i=0,len=man[k].size();i<len;i++){
if(man[k][i].x==x&&man[k][i].y==y&&man[k][i].hp>0){
return mp(k,i);
}
}
}
void fight(){
for(int i=1;i<=12;i++){
for(int j=1;j<=12;j++){
if(cnt[0][i][j]+cnt[1][i][j]+cnt[2][i][j]!=2)continue;
if(cnt[0][i][j]==2||cnt[1][i][j]==2||cnt[2][i][j]==2)continue;
pii id[2];
int siz=0;
if(cnt[0][i][j]==1){
id[siz++]=findPos(i,j,0);
}
if(cnt[1][i][j]==1){
id[siz++]=findPos(i,j,1);
}
if(cnt[2][i][j]==1){
id[siz++]=findPos(i,j,2);
}
Man &A=man[id[0].first][id[0].second];
Man &B=man[id[1].first][id[1].second];
int atk1=A.attack();
int atk2=B.attack();
A.hp-=atk2;if(A.hp<=0)cnt[A.kind][A.x][A.y]--;
B.hp-=atk1;if(B.hp<=0)cnt[B.kind][B.x][B.y]--;
}
}
}
void work(){
while(step--){
fight();
for(int i=0;i<3;i++){
for(int j=0,len=man[i].size();j<len;j++)if(man[i][j].hp>0){
man[i][j].move();
}
}
}
}
void print(){
for(int k=0;k<3;k++){
int num=0,hpsum=0;
for(int i=0,len=man[k].size();i<len;i++){
if(man[k][i].hp>0){
num++;hpsum+=man[k][i].hp;
}
}
printf("%d %d\n",num,hpsum);
}
printf("***\n");
}
int main(){
//freopen("D://input.txt","r",stdin);
int T;scanf("%d",&T);
while(T--){
init();
scanf("%d",&step);
char s[2];
while(scanf("%s",s)!=EOF&&s[0]!='0'){
int x,y,mp,atk,hp;
scanf("%d%d%d%d%d",&x,&y,&mp,&atk,&hp);
if(s[0]=='S'){
man[0].pb(Man(x,y,hp,mp,atk,0));
cnt[0][x][y]++;
}
else if(s[0]=='W'){
man[1].pb(Man(x,y,hp,mp,atk,1));
cnt[1][x][y]++;
}
else if(s[0]=='E'){
man[2].pb(Man(x,y,hp,mp,atk,2));
cnt[2][x][y]++;
}
}
work();
print();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: