HDU 1107 武林(模拟)
2016-07-11 18:01
316 查看
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1107
这题算是挺麻烦的一个模拟了。。wa了一次,发现有句话忘记写了,加上去就过了。纪念一下,写了差不多两个小时。
这题算是挺麻烦的一个模拟了。。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; }
相关文章推荐
- java集合类(二)List之ArrayList
- mysql中的事务处理
- jQuery选择器
- 设计模式:单例模式
- 使用Python的Tornado框架实现一个Web端图书展示页面
- Hadoop-Streaming实战经验及问题解决方法总结
- JavaScript中call,apply和prototype
- CAShapeLayer使用案例
- CADisplayLink 定时器改变label文字颜色的问题
- 各种排序算法的实现及其比较(c++实现)
- mysql 货币字段类型的存储
- 安卓6.0需要BLUETOOTH_PRIVILEGED的大坑
- iOS Provisioning Profile(Certificate)与Code Signing详解
- Arrays.asList方法总结
- CodeForces 514D-R2D2 and Droid Army
- 【服务器学习】Idea 快捷键
- 使用delayedQueue实现你本地的延迟队列
- 35 个 Java 代码性能优化总结(复制于码农网)
- 动脑
- JavaScript实现拖拽预览,AJAX小文件上传