炉石传说 ccf

2023-05-16

##炉石传说 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);
//以下是错误例子,这么写会让it变成野指针,特别是在遍历c++某个容器的时候
//比如要删除某个容器值相同的元素,如果在循环里这么写就会出现野指针
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++)
	{
	//如果中途有英雄死掉就直接退出,我也不懂为啥要加这个,题目似乎说了如果有英雄挂掉就不会有操作了。。。我是加上了,也不能AC
		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(使用前将#替换为@)

炉石传说 ccf 的相关文章

随机推荐

  • centos7最小安装硬件要求

    在百度搜了半天都没找到centos7最小安装硬件要求 xff0c 于是就去官网溜了一圈找到了 xff0c 见下表 CentOS至少需要以下RAM数量 xff1a 本地媒体安装 xff08 USB xff0c DVD xff09 xff1a
  • 显卡GPU copy占用跳来跳去解决办法

    新买的笔记本玩游戏帧数反复横条 xff0c 与此同时发现任务管理中的GPU Copy也是忽然就1 如图所示 解决方案如下 按win 43 i xff0c 进入设置 xff0c 找到游戏 关闭xbox game bar 关闭游戏模式
  • DiskGenius无法分区

    今天新买的笔记本到了 xff0c 登录了一下Microsoft账号设置了个密码 xff0c 结果出了个锁 用DG就没法分区了 解决方法如下 xff0c 一 按下win 43 i进入设置 xff0c 点击账户 xff0c 左侧账户信息 xff
  • 刷新率调到144hz自动跳回60

    按照这个方法试一下应该可以解决 https blog csdn net qq 35485875 article details 119680804
  • 主板支持vt但是模拟器显示不支持vt也没有开启vt

    实测去 启用或关闭windows功能 里面 xff0c 关闭如下东西就OK了 xff0c 能够和VMware共存 Hyper V Windows 沙盒 Windows 虚拟机监控平台 虚拟机平台
  • 360浏览器用地址栏搜索怎么更改搜索引擎

    就像这样 xff0c 如果这时候点击下面的搜索 xff0c 那么就会自动跳转到360的搜索引擎 如此坑 xff0c 困扰我好久了 xff0c 我都忍了 xff0c 今天非搞它一下不可 我想到的办法是用hosts把这个域名重定向到本地 xff
  • VMware 无法安装 VMware Tools, 提示VMCI,内存驱动

    我是VMware16 镜像为Windows 7 Ultimate with Service Pack 1 x64 DVD Chinese Simplified 最新版7601 文件名 xff1a cn windows 7 ultimate
  • cmake3.8.2安装

    下载 xff1a 官网下载https cmake org download xff0c 最新的为3 14版本 xff0c 下载完成如下图 xff1a 安装很简单 xff0c 一路next
  • C语言:二维数组的使用及水平制表符(tab)

    题目 xff1a 编写一个计算从0 10各个数的平方和立方的程序 xff0c 并使用水平制表符 xff08 tab xff09 打印下表 要点一 xff1a 二维数组的应用 int a 11 3 定义了一个11 3 xff0c 即11行3列
  • win+G没反应,Xbox game bar按不出来

    按照https www bilibili com read cv7305256 这个方法前三个方案都没得用 重新设置快捷键也没有用根本就不识别 win 43 g就是填不进去 xff0c 其它快捷键可以 xff0c 就算填进去了 xff0c
  • gta5如何快速吃零食,M键里面没有动作

    在M菜单的风格里面 xff0c 把动作改成吃零食 去商店买好零食 xff0c 然后按M在动作那里设置成吃零食 xff0c 之后直接按Caps Lock键就能吃了立马补血
  • gta5如何快速吃零食,M键里面没有动作

    在M菜单的风格里面 xff0c 把动作改成吃零食 去商店买好零食 xff0c 然后按M在动作那里设置成吃零食 xff0c 之后直接按Caps Lock键就能吃了立马补血
  • GTA5怎么快速吃零食 回血

    百度下载按键精灵 新建脚本 KeyDowns 34 M 34 1 Delay 30 KeyUps 34 M 34 1 Delay 30 KeyDowns 34 Down 34 1 Delay 30 KeyUps 34 Down 34 1 D
  • GTA5前置任务怎么使用差事传送

    首先说一下会出的问题 1 线上等级没有到30级是没有提高产量差事的 3 提高产量差事没有出现R星服务器错误直接进去差事的 xff0c 请把你的游戏语言改成简体中文 xff0c 其他语言卡不了 有部分人出现了错误也会出现差事 4 复仇者的任务
  • npm ERR! code ERR_INVALID_URL,npm err安装报错

    nodeenv PS E WebstormProjects node onebot 1 3 final 2 gt npm i npm ERR code ERR INVALID URL npm ERR Invalid URL npm ERR
  • 桌面alt+enter按不了,没反应

    关闭360桌面助手即可 xff0c 如果是其它问题按下面的方法排查 https blog csdn net m0 37787662 article details 104038720 https blog csdn net zw521cx
  • 打游戏csgo的时候莫名其妙卡一下

    经过长期观察发现如下情况 我是天选2 3060 也是csgo突然卡一下 xff0c 有时候声音也一起同时卡一下 xff0c 半秒的样子 这篇文章适用于开启了核显和独显的 xff0c 并且是核显直连 之前一直在找 xff0c 看了好多解决方案
  • csgo游戏中怎么显示现实中的时间

    csgo游戏中怎么显示现实中的时间 xbox game bar下载这个应用就好了 这个更好使 提供一个浏览器 xff0c 这样的话想显示什么都可以了 按F11全屏
  • 华硕笔记本全硬盘恢复原厂状态 实机操作,MYASUS IN WINRE恢复,ASUS RECOVERY恢复

    本教程的前提的在之前就备份了原厂的RECOVERY分区 xff0c RESTORE分区 xff0c MYASUS分区 如果这些分区都没有的话那就只能找同型号笔记本的朋友要一份了 xff0c 或者去售后 xff0c 告诉他这三个分区都要恢复
  • 炉石传说 ccf

    炉石传说 ccf 题我就不贴了 xff0c 花了大概一下午写 xff0c 虽然感觉这个题难度不是很大 xff0c 但是还是结果只有七十分 xff0c ccf显示运行错误 xff0c 这个提示应该是运行测试用例的时候出现了逻辑错误 感觉应该还