201609-3 炉石传说
题目
思路
此题采用vector很方便,因为有很多插入删除操作,可千万不要像我一样用纯数组。我刚开始没有弄清楚编号的处理,就急于开了两个数组,这样的话插入删除都需要自己实现,就容易出错。
如果你不幸入了数组的坑,可以参考一下本渣的代码。
注意不要把英雄像删随从一样删掉了!
英雄和随从死亡的判定是生命值h<=0。
AC代码如下
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int n,h[2][9],atk[2][9],index=0;//数组开到9,多一组0可以用来填充,也方便用来判断
void clear(int x,int i){//除尸
if(i==0) return;//不要把英雄删掉了!
if(h[x][i]<=0){//一次只可能死这一个
for(int j=i+1;j<9;j++){
h[x][j-1]=h[x][j];
atk[x][j-1]=atk[x][j];
}
}
}
int main(){
memset(h,0,sizeof(h));
memset(atk,0,sizeof(atk));
h[0][0]=h[1][0]=30;
cin>>n;
while(n--){
string op;
cin>>op;
if(op=="end"){
index=!index;
continue;
}
if(op=="summon"){
int p,a,hs;
cin>>p>>a>>hs;
for(int i=7;i>p;i--){//右移,给新随从腾位置
h[index][i]=h[index][i-1];
atk[index][i]=atk[index][i-1];
}
h[index][p]=hs;//新随从上位
atk[index][p]=a;
continue;
}
int a,b;
cin>>a>>b;
h[index][a]-=atk[(index+1)%2][b];
h[(index+1)%2][b]-=atk[index][a];
clear(index,a);
clear((index+1)%2,b);
}
if(h[0][0]<=0) cout<<-1<<endl;
else if(h[1][0]<=0) cout<<1<<endl;
else cout<<0<<endl;
for(int i=0;i<2;i++){
cout<<h[i][0]<<endl;
for(int j=1;j<9;j++){//这里j上限设为9,就不用特判了
if(h[i][j]==0){
cout<<j-1;
break;
}
}
for(int j=1;j<8;j++){
if(h[i][j]>0){
cout<<" "<<h[i][j];
} else break;
}
cout<<endl;
}
return 0;
}
(2019.9.11)
vector代码如下
#include<iostream>
#include<string>
#include<vector>
using namespace std;
struct node{
int h,att;
};
int main(){
int n,f=0;
cin>>n;
vector<node> a[2];
a[0].push_back((node){30,0});
a[1].push_back((node){30,0});
string op;
while(n--){
cin>>op;
if(op=="summon"){
int p,at,h;
cin>>p>>at>>h;
a[f].insert(a[f].begin()+p,(node){h,at});
}
else if(op=="attack"){
int atker,df;
cin>>atker>>df;
a[f][atker].h-=a[!f][df].att;
a[!f][df].h-=a[f][atker].att;
if(a[f][atker].h<=0) a[f].erase(a[f].begin()+atker);
if(a[!f][df].h<=0&&df!=0) a[!f].erase(a[!f].begin()+df);
}
else f=!f;
}
if(a[0][0].h<=0) cout<<-1<<endl;
else if(a[1][0].h<=0) cout<<1<<endl;
else cout<<0<<endl;
cout<<a[0][0].h<<endl<<a[0].size()-1;
for(int i=1;i<a[0].size();i++) cout<<" "<<a[0][i].h;
cout<<endl;
cout<<a[1][0].h<<endl<<a[1].size()-1;
for(int i=1;i<a[1].size();i++) cout<<" "<<a[1][i].h;
cout<<endl;
return 0;
}