题目意思:汉字描述的很清楚

注意事项:1、可能出现不能走动的情况;2、在初始状态时也可能比武;3、只有在同一个位置只有两个不同门派的弟子的时候才会比武,4、死掉的直接删除。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <vector>
#include <string>
#include <algorithm>using namespace std;#define ROWS 13
#define COLUMNS 13
//directions index 0 for down, 1 for up, 2 for right, 3 for left, 4 for right down, 5 for left up
int dir[6][2] = {{1, 0}, {-1, 0},{0, 1}, {0, -1},{1, 1}, {-1, -1}};
// Position
class Position
{
public:int row;int column;
public:Position(){}Position(int row, int column):row(row), column(column){}~Position(){}// judge where the current position is valid;bool valid(){return (row>0&&row<ROWS&&column>0&&column<COLUMNS);}//--------------------DebugS--------------------friend ostream&operator<<(ostream &out, const Position &p);friend istream&operator>>(istream&in, Position &p);//--------------------DebugE--------------------
};//--------------------DebugS--------------------
ostream&operator<<(ostream &out, const Position &p)
{out << "(" << p.row << "," << p.column << ")";return out;
}
istream&operator>>(istream&in, Position &p)
{in>>p.row>>p.column;return in;
}
//--------------------DebugE--------------------
//wulin different school
class WLin
{
public:char school;Position curPos;int vitality;int interForce;int skill;int d;//current directionbool alive;//where alive
public:WLin(){if (school == 'S')d = 0;else if (school == 'W')d = 2;else d = 4;alive = true;}WLin(char school, Position p, int v, int i, int s):school(school), curPos(p), vitality(v), interForce(i), skill(s){if (school == 'S')d = 0;else if (school == 'W')d = 2;else d = 4;alive = true;}~WLin(){}// 1 for 'S', 2 for 'W', 4 for 'E'int getValue(){if (school == 'S')return 1;if (school == 'W')return 2;if (school == 'E')return 4;return 1024;}bool isS(){return school == 'S';}bool isW(){return school == 'W';}bool isE(){return school == 'E';}/calculate the attack powerint attackPower(){if (school == 'S'){return (int)((0.5*interForce+0.5*skill)*(vitality+10)/100);}if (school == 'W'){return (int)((0.8*interForce+0.2*skill)*(vitality+10)/100);}if (school == 'E'){return (int)((0.2*interForce+0.8*skill)*(vitality+10)/100);}return -1;}//--------------------DebugS--------------------friend ostream& operator<<(ostream &out, const WLin &wl);//--------------------DebugE--------------------
};
//--------------------DebugS--------------------
ostream& operator<<(ostream&out, const WLin &wl)
{out << wl.school << ": P->" << wl.curPos << "<- S->(" << wl.vitality<< "," << wl.interForce << "," << wl.skill << ")<- L->" << wl.alive << "<- D->"<< wl.d << "<-";return out;
}
//--------------------DebugE--------------------vector <WLin > disciple;int N;
//--------------------DebugS--------------------
ostream& operator<<(ostream&out, const vector<WLin > &d)
{for (int i = 0; i < (int)d.size(); ++i){out << d[i] << endl;}return out;
}
//--------------------DebugE--------------------
class Grid //grid
{
public:int ct;int value;//S=1, W=2, E=4;vector <int > diIndex;
public :Grid(){}Grid(int ct, int value):ct(ct), value(value){}~Grid(){}//two disciple with different schoolbool differentSchool(){return (ct==2&&(value==3||value==5||value==6));}
};Grid grid[ROWS][COLUMNS];
//reset grid
void resetGrid()
{for (int i = 1; i < ROWS; ++i){for (int j = 1; j < COLUMNS; ++j){grid[i][j].diIndex.clear();grid[i][j].ct = grid[i][j].value = 0;}}
}
//go one step
void go()
{for (int i = 0; i < (int)disciple.size(); ++i){if (disciple[i].alive){Position curPos = disciple[i].curPos;int d = disciple[i].d;Position tmp(curPos.row+dir[d][0], curPos.column+dir[d][1]);if (!tmp.valid()){d ^= 1;tmp = Position(curPos.row+dir[d][0], curPos.column+dir[d][1]);if (!tmp.valid()){grid[curPos.row][curPos.column].ct++;grid[curPos.row][curPos.column].value += disciple[i].getValue();grid[curPos.row][curPos.column].diIndex.push_back(i);continue;}disciple[i].d = d;}disciple[i].curPos = tmp;grid[tmp.row][tmp.column].ct++;grid[tmp.row][tmp.column].value += disciple[i].getValue();grid[tmp.row][tmp.column].diIndex.push_back(i);}}
}
//count and print the final state
void coutAndPrintAns()
{int cts = 0, ctw = 0, cte = 0;int vs = 0, vw = 0, ve = 0;for (int i = 0; i < (int)disciple.size(); ++i){if (disciple[i].alive){if (disciple[i].isS()){cts++;vs += disciple[i].vitality;}else if (disciple[i].isW()){ctw++;vw += disciple[i].vitality;}else if (disciple[i].isE()){cte++;ve += disciple[i].vitality;}}}printf ("%d %d\n%d %d\n%d %d\n***\n", cts, vs, ctw, vw, cte, ve);
}
//solve the problem
void solve()
{do{for (int i = 1; i < ROWS; ++i){for (int j = 1; j < COLUMNS; ++j){if (grid[i][j].differentSchool()){int ii1 = grid[i][j].diIndex[0];int ii2 = grid[i][j].diIndex[1];int ii1ap = disciple[ii1].attackPower();int ii2ap = disciple[ii2].attackPower();disciple[ii1].vitality -= ii2ap;if (disciple[ii1].vitality <= 0){disciple[ii1].alive = false;}disciple[ii2].vitality -= ii1ap;if (disciple[ii2].vitality <= 0){disciple[ii2].alive = false;}}}}resetGrid();go();N--;//--------------------DebugS--------------------//cout << disciple << endl;//--------------------DebugE--------------------}while (N>0);coutAndPrintAns();
}int main()
{int t;cin >> t;while (t--){cin >> N;disciple.clear();char school;Position p;int v, s, i, index = 0;resetGrid();while (cin >> school){if (school == '0')break;cin >> p >> i >> s >> v;//--------------------DebugS--------------------//cout << "out : " << school << " " << p << " " << i << " " << s << " " << v << endl;//--------------------DebugE--------------------WLin tmp(school, p, v, i, s);disciple.push_back(tmp);grid[p.row][p.column].ct++;grid[p.row][p.column].value += tmp.getValue();grid[p.row][p.column].diIndex.push_back(index);index++;}//--------------------DebugS--------------------//cout << disciple << endl;//--------------------DebugE--------------------solve();}return 0;
}

hdu1107+武林+模拟相关推荐

  1. HDU 1107 武林 大模拟

    题目:https://cn.vjudge.net/problem/HDU-1107 题意:中文题干不再赘述,仅强调两处细节 (1)仅当一个格子里有两名弟子,且二者分属不同门派时才会发生战斗. (2)每 ...

  2. 使用Python模拟武侠小说中两派人的一场遭遇战。

    使用Python模拟武侠小说中两派人的一场遭遇战. 每个人都有名字.血量(HP) .一系列技能及技能对应的攻击输出.每个人的攻击方式均一致,即随机从自己的技能包中抽取一个技能进行攻击.两派人(自己命名 ...

  3. Qt武林秘籍学习笔记摘要

    1 原文链接 Qt开发经验: 自己总结的这十多年来做Qt开发以来的经验,以及Qt相关武林秘籍电子书,会一直持续更新增加,欢迎各位留言增加内容或者提出建议,谢谢! (gitee.com) 编程语录: 自 ...

  4. 编程其实是一门武林绝学,你是哪个门派?

    武侠小说中,各路侠客绿林好汉都是从基本功开始一招一式学起,掌握了足够多的招式后,加之勤学苦练,量变引起质变,会有一天打开任督二脉顿悟出这些招式背后的哲学逻辑,成为一代宗师.在编程的学习过程中,我们何尝 ...

  5. 中国这门失传已久的武林绝学,竟让研究它的老外拿了诺贝尔奖

    全世界只有3.14 % 的人关注了 爆炸吧知识 欲练神功 学好物理 中国武术,博大精深.能够掌握一门武林绝学,是全世界男人的终极梦想. 可翻翻公认的武林十大绝学:葵花宝典.六脉神剑.九阳神功....不 ...

  6. HDU 1107 武林

    第一次ACM写这么多代码..不过题目简单.没什么难点..只要模拟就行了.. /* hdu 1107 http://acm.hdu.edu.cn/showproblem.php?pid=1107 Exe ...

  7. springboot实现SSE服务端主动向客户端推送数据,java服务端向客户端推送数据,kotlin模拟客户端向服务端推送数据

    SSE服务端推送 服务器向浏览器推送信息,除了 WebSocket,还有一种方法:Server-Sent Events(以下简称 SSE).本文介绍它的用法. 在很多业务场景中,会涉及到服务端向客户端 ...

  8. curl模拟post请求

    另外可尝试 postman工具 或者用request 直接请求 CURL 发送POST请求curl -header "Content-Type: application/json" ...

  9. flask_模拟请求post,get

    #coding:utf-8 import requestsres = requests.post(url="http://192.168.135.105:8888/",data={ ...

最新文章

  1. 修改 mysql 支持远程连接
  2. button,submit, image的区别 点onclick后隐藏行
  3. 关于Reapeter的总结
  4. 201807 相关性度量的几种方法-卡方检验、相关系数、信息增益...
  5. Java进阶篇(六)——Swing程序设计(上),java面试题,java基础笔试题,BAT
  6. python类型转换astype-python中numpy数据类型转换的方法
  7. LeetCode447. Number of Boomerangs
  8. 学习halcon的论坛与书籍
  9. MAC-终端命令大全
  10. markdown 删除线
  11. 判断一个正整数是否为2的整数次幂的宏定义
  12. 可用c语言编程的科学计算器,一个用C语言实现的科学计算器
  13. Android仿制知乎滑动广告条
  14. apache 获取不到 authorization 解决办法
  15. 点评阿里云盛大云代表的云计算IaaS产业---中国云计算
  16. 关于video标签,禁止点击播放时自动全屏,和video出现诡异窗口重叠
  17. OSChinaiOS客户端源码剖析001(架构篇)
  18. 互联网圈内的域名大战
  19. java--设计一个Javabean记载网页的访问数量
  20. Azkaban快速入门

热门文章

  1. 一个人在家怎么赚钱?普通人如何通过网络实现在家就能赚钱
  2. CentOS8 安装mysql8- 解压安装版
  3. 物理建模钢琴-Modartt Pianoteq Pro v6.7.0 WiN
  4. 实验记录 | 8/14
  5. JavaScript词汇表
  6. VTK:交互与拾取——单位拾取
  7. 虚拟机配置DNS服务器
  8. 红米K30S至尊纪念版和红米K30至尊纪念版哪个好
  9. POJ1061青蛙的约会(拓展欧几里得)
  10. 用ajax进行分页查询