##炉石传说 ccf
题我就不贴了,花了大概一下午写,虽然感觉这个题难度不是很大,但是还是结果只有七十分,ccf显示运行错误,这个提示应该是运行测试用例的时候出现了逻辑错误。感觉应该还是跟内存有关的问题,找了很久也没想到为啥,如果有大佬看出了问题欢迎指正。
然后这里大概就分享一下思路:首先作为ccf第三题的惯例主要还是要先想清楚用啥数据结构?怎么组织?怎么读入数据,处理字符串?
首先这题可以用链表,c++内置的list有很方便的insert操作和erase操作。但是erase需要小心,不能直接删除,直接删除就会存在野指针的问题。
比如:
list<int> test_list
test_list.push_back(3);
test_list.push_back(4);
list<int>::iterator it=test_list.begin();
advance(it,1);
test_list.erase(it);
然后这题可以按照一般套路搞个结构体把这些玩家这个类型给包起来,
这题难处理一点的就是随从的位置可能会发生着变化;
ok,注意事项大概就是这些。然后下面是代码。应该写的还是比较简单易懂的,虽然这个代码还是有些问题的,欢迎大佬指正。
70分版。如果找到了问题还会更新 先mark一下
#include <bits/stdc++.h>
using namespace std;
typedef struct{
int acttracts;
int health;
bool is_alive;
int index;
}role;
typedef struct{
role hero;
list<role> slavers;
}player;
void update_index(player& ply)
{
list<role>::iterator it;
for(it=ply.slavers.begin();it!=ply.slavers.end();it++)
{
int in=distance(ply.slavers.begin(),it)+1;
it->index=in;
}
}
void update(player& pre)
{
list<role>::iterator pre_it,last_it;
for(pre_it=pre.slavers.begin();pre_it!=pre.slavers.end();)
{
if((*pre_it).is_alive==false)
{
pre_it=pre.slavers.erase(pre_it);
}
else
pre_it++;
}
update_index(pre);
}
int main(void)
{
player pre_player,last_player;
pre_player.hero={0,30,true,0};
last_player.hero={0,30,true,0};
bool turn_to_pre_player=true;
int n;
cin>>n;
for(int i=0;i<n;i++)
{
if(pre_player.hero.is_alive==false||last_player.hero.is_alive==false)
break;
string command;
cin>>command;
int _position,_attack,_health;
role new_slaver;
if(command=="summon")
{
cin>>_position>>_attack>>_health;
list<role>::iterator it1;
new_slaver={_attack,_health,true,_position};
if(turn_to_pre_player==true)
{
if(pre_player.slavers.size()<_position)
{
pre_player.slavers.push_back(new_slaver);
}
else
{
for(it1=pre_player.slavers.begin();it1!=pre_player.slavers.end();it1++)
{
if((*it1).index==_position)
break;
}
pre_player.slavers.insert(it1,new_slaver);
update_index(pre_player);
}
}
if(turn_to_pre_player==false)
{
if(last_player.slavers.size()<_position)
last_player.slavers.push_back(new_slaver);
else
{
for(it1=last_player.slavers.begin();it1!=last_player.slavers.end();it1++)
{
if((*it1).index==_position)
break;
}
last_player.slavers.insert(it1,new_slaver);
update_index(last_player);
}
}
}
if(command=="attack")
{
int attracter,defender;
cin>>attracter>>defender;
list<role>::iterator it2,it3;
if(turn_to_pre_player==true)
{
for(it2=pre_player.slavers.begin();it2!=pre_player.slavers.end();it2++)
{
if((*it2).index==attracter)
break;
}
for(it3=last_player.slavers.begin();it3!=last_player.slavers.end();it3++)
{
if((*it3).index==defender)
break;
}
(*it2).health=(*it2).health-(*it3).acttracts;
(*it3).health=(*it3).health-(*it2).acttracts;
if((*it2).health<=0)
(*it2).is_alive=false;
if((*it3).health<=0)
(*it3).is_alive=false;
}
if(turn_to_pre_player==false)
{
for(it2=last_player.slavers.begin();it2!=last_player.slavers.end();it2++)
{
if((*it2).index==attracter)
break;
}
for(it3=pre_player.slavers.begin();it3!=pre_player.slavers.end();it3++)
{
if((*it3).index==defender)
break;
}
(*it2).health=(*it2).health-(*it3).acttracts;
(*it3).health=(*it3).health-(*it2).acttracts;
if((*it2).health<=0)
(*it2).is_alive=false;
if((*it3).health<=0)
(*it3).is_alive=false;
}
update(pre_player);
update(last_player);
}
if(command=="end")
{
turn_to_pre_player=!turn_to_pre_player;
}
}
int winner;
if(pre_player.hero.is_alive==true&&last_player.hero.is_alive==false)
winner=1;
if(pre_player.hero.is_alive==false&&last_player.hero.is_alive==true)
winner=-1;
if(pre_player.hero.is_alive==false&&last_player.hero.is_alive==false)
winner=0;
cout<<winner<<endl;
cout<<pre_player.hero.health<<endl;
cout<<pre_player.slavers.size();
list<role>::iterator it4;
for(it4=pre_player.slavers.begin();it4!=pre_player.slavers.end();it4++)
{
cout<<" "<<(*it4).health;
}
cout<<endl;
cout<<last_player.hero.health<<endl;
cout<<last_player.slavers.size();
for(it4=last_player.slavers.begin();it4!=last_player.slavers.end();it4++)
{
cout<<" "<<(*it4).health;
}
cout<<endl;
return 0;
}
```cpp
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)