武林 HDU - 1107
题目链接:https://vjudge.net/problem/HDU-1107
注意:题目中只有两个不同门派的人在同一个地方才能对决,其他情况都不能对决。
还有,这步的有效的攻击只有走到下一步之后才生效,所以会出现样例1和样例2的情况。
代码有注释,便于理解,这理我说一下vis[][][]数组的用处。
vis[x][x][1] 表示少林寺人的编号。
vis[x][x][2] 表示武当派人的编号。
vis[x][x][3] 表示峨眉派人的编号。
vis[x][x][4] 表示一个门派是否有超过两个人。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
#include <cmath>
#include <iomanip>
using namespace std; typedef long long LL;
#define inf (1LL << 25)
#define rep(i,j,k) for(int i = (j); i <= (k); i++)
#define rep__(i,j,k) for(int i = (j); i < (k); i++)
#define per(i,j,k) for(int i = (j); i >= (k); i--)
#define per__(i,j,k) for(int i = (j); i > (k); i--) const int N = ;
int vis[N][N][];
int steps; struct People{ char c; //门派
int tot;//标记
int x,y;//坐标
int dir;//方向 正负1来方便判断
int nx,wx,sx; int att(){//攻击
if(c == 'S') return (0.5 * nx + 0.5 * wx) * (sx * 1.0 + ) /;
else if(c == 'W') return (0.8 * nx + 0.2 * wx) * (sx * 1.0 + ) /;
else if(c == 'E') return (0.2 * nx + 0.8 * wx) * (sx * 1.0 + ) /;
} //被攻击
void is_att(int x) { sx -= x;} //移动
void mv(){
if(c == 'S'){
if(!(x + dir >= && x + dir <= )) dir = -dir;
x += dir;
}
else if(c == 'W'){
if(!(y + dir >= && y + dir <= )) dir = -dir;
y += dir;
}
else if(c == 'E'){
int xx = x + dir;
int yy = y + dir;
if(!(xx >= && xx <= && yy >= && yy <= )) dir = -dir;
if(x + dir >= && x + dir <= && y + dir >= && y + dir <= ) x += dir, y += dir;
}
} //写下标记
void vis_w(){
if(c == 'S'){
if(vis[x][y][] == ) vis[x][y][] = tot;
else vis[x][y][] = ;
}
else if(c == 'W'){
if(vis[x][y][] == ) vis[x][y][] = tot;
else vis[x][y][] = ; }
else if(c == 'E'){
if(vis[x][y][] == ) vis[x][y][] = tot;
else vis[x][y][] = ;
}
} //擦除标记
void vis_e(){
rep(i,,) vis[x][y][i] = ;
} }p[];
bool died[]; //该编号的人是否死亡
int pl;//人数 void work(){ rep(q,,steps){
rep(i,,) rep(j,,){ if(vis[i][j][] == ) continue; //一个门派超过两个人
int a = ,b = ,num = ;
rep(p,,) if(vis[i][j][p] != ){
num++;
if(!a) a = vis[i][j][p];
else b = vis[i][j][p];
} if(num != ) continue; //不是两个人 int w1 = p[a].att();
int w2 = p[b].att();
p[a].is_att(w2);
p[b].is_att(w1);
} rep(o,,pl) if(!died[o]){
p[o].vis_e();//擦除标记
if(p[o].sx <= ) died[o] = true;
} rep(o,,pl) if(!died[o]){
p[o].mv();
p[o].vis_w();//标记
}
}
} void print(){ int m[] = {};
int t[] = {}; rep(o,,pl){
if(died[o]) continue; if(p[o].c == 'S') m[]++, t[] += p[o].sx;
else if(p[o].c == 'W') m[]++, t[] += p[o].sx;
else if(p[o].c == 'E') m[]++, t[] += p[o].sx;
} cout << m[] << ' ' << t[] << endl;
cout << m[] << ' ' << t[] << endl;
cout << m[] << ' ' << t[] << endl;
cout << "***" << endl;
} int main(){ ios::sync_with_stdio(false);
cin.tie(); int T;
cin >> T;
char in;
while(T--){ pl = ;
rep(i,,) died[i] = false;
rep(i,,) rep(j,,) rep(k,,) vis[i][j][k] = ;
cin >> steps; while(cin >> in){
if(in == ''){
break;
} ++pl;
p[pl].c = in;
p[pl].tot = pl;
p[pl].dir = ;
cin >> p[pl].x >> p[pl].y >> p[pl].nx >> p[pl].wx >> p[pl].sx;
p[pl].vis_w();
}
work();
print();
} getchar(); getchar();
return ;
}
武林 HDU - 1107的更多相关文章
- 【HDOJ】1107 武林
简单模拟,题目数据太弱太弱了. /* 1107 */ #include <iostream> #include <cstdio> #include <cstring> ...
- HDU——PKU题目分类
HDU 模拟题, 枚举1002 1004 1013 1015 1017 1020 1022 1029 1031 1033 1034 1035 1036 1037 1039 1042 1047 1048 ...
- [转] HDU 题目分类
转载来自:http://www.cppblog.com/acronix/archive/2010/09/24/127536.aspx 分类一: 基础题:1000.1001.1004.1005.1008 ...
- HDU ACM 题目分类
模拟题, 枚举1002 1004 1013 1015 1017 1020 1022 1029 1031 1033 1034 1035 1036 1037 1039 1042 1047 1048 104 ...
- HDU 2502 月之数(二进制,规律)
月之数 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- HDU 5643 King's Game 打表
King's Game 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5643 Description In order to remember hi ...
- hdu 1174:爆头(计算几何,三维叉积求点到线的距离)
爆头 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submissi ...
- 转载:hdu 题目分类 (侵删)
转载:from http://blog.csdn.net/qq_28236309/article/details/47818349 基础题:1000.1001.1004.1005.1008.1012. ...
- HDU 1410 PK武林盟主
Problem Description 枫之羽认为自己很强,想当武林盟主,于是找现任武林盟主氢氧化铜挑战.氢氧化铜欣然接受了挑战,两人约好于下个月的月圆之夜在HDU校园内的三根柱子上进行决战.这场PK ...
随机推荐
- tensorflow学习笔记(1)-环境配置
配置环境anaconda3+windows10+pycharm+python==3.5.2+tensorflow==1.1.4+cuda10.0+cudnn7 https://www.anaconda ...
- scrapy实战3利用fiddler对手机app进行抓包爬虫图片下载(重写ImagesPipeline):
关于fiddler的使用方法参考(http://jingyan.baidu.com/article/03b2f78c7b6bb05ea237aed2.html) 本案例爬取斗鱼 app 先利用fidd ...
- ~~Python解释器安装教程及环境变量配置~~
进击のpython Python解释器安装教程以及环境变量配置 对于一个程序员来说,能够自己配置python解释器是最基础的技能 那么问题来了,现在市面上有两种Python版本 Python 2.x ...
- Spring MVC源码(三) ----- @RequestBody和@ResponseBody原理解析
概述 在SpringMVC的使用时,往往会用到@RequestBody和@ResponseBody两个注解,尤其是处理ajax请求必然要使用@ResponseBody注解.这两个注解对应着Contro ...
- [WPF自定义控件库]了解WPF的布局过程,并利用Measure为Expander添加动画
1. 前言 这篇文章介绍WPF UI元素的两步布局过程,并且通过Resizer控件介绍只使用Measure可以实现些什么内容. 我不建议初学者做太多动画的工作,但合适的动画可以引导用户视线,提升用户体 ...
- C语言 实验设备管理系统
实验设备信息管理系统 简单的思路,简单的算法 题目简述:实验室设备信息用文件存储,提供文件的输入输出操作:要能够完成设备的录入和修改,需要提供设备添加和修改操作:实现对设备进行分类统计,需要提供排序操 ...
- 微信小程序开发--数据绑定
一.单项数据绑定 <!-- index.wxml --> <view class="container"> <form> <input v ...
- ASP.NET CORE 入门教程(附源码)
ASP.NET CORE 入门教程 第一课 基本概念 基本概念 Asp.Net Core Mvc是.NET Core平台下的一种Web应用开发框架 符合Web应用特点 .NET Core跨平台解决方案 ...
- 网页内嵌html遇到的问题
在项目中遇到个问题 充值功能是点击一个按钮这个按钮会弹出模态框,输入充值金额会执行一段脚本自动提交数据到https://openapi.alipay.com/gateway.do上 结果:本网页跳转到 ...
- 最全caffe安装踩坑记录(Anaconda,nvidia-docker,Linux编译)
Anaconda,nvidia-docker,Linux三种方式安装caffe 1.Anaconda安装caffe 1.首先安装anaconda 2.创建虚拟环境(python2.7) conda c ...