(本文是从我的旧博客迁移过来的)

问题地址:http://acm.timus.ru/problem.aspx?space=1&num=1258

  前几日在博客园看到这种在线测试的时候,有一种相见恨晚的感觉,于是随便选了一道感兴趣的题(No.1258:Pool)开始做。为了准确了解题的意思,我把题翻译成中文了,这道题的原理和台球很相似(由于以前常玩可乐8,所以对台球的问题倍感亲切)。但不知道为什么出题人将台球问题说成了一个程序员撞墙的问题。下面是我翻译后的,英语不好,译错的地方请见谅。

问题:

1258. Pool

运行时间限制: 1.0 秒
内存限制: 16 MB
 
在午休的时候,程序员Vasechkin喜欢在他的矩形房间里闲逛。他从他工作的地方开始溜达,直到他有了再开始工作的念头才停止。我们已知当Vasechkin撞墙时,他的运动规律相当符合“入射角等于反射角”定律。并且Vasechkin走的路线是很直的线段。凶狠的办公室主任决定找出他浪费了多少时间在溜达上。显然Vasechkin走过的长度除以他的平均速度(事先测量)可得出所用的时间。所以必须知道这个长度!并且从Vasechkin的碰撞中能清楚的知道Vasechin的撞墙顺序。可能还有更简单的方法计算出程序员所浪费的时间,但是办公室主任认为这是解决问题的最佳方法。

输入

第一行由两个整数W和D组成——他们分别是Vasechkin所在房间的宽和长(0<=W,D<=1000,单位:米)。
第二行由Vasechkin的起始位置相对于左上角的坐标组成(0<X0<W,0<y0<D)。 
第三行是终点相对于左上角的坐标(0<x1<W,0<y1<D),
最后的第四行由字母L,R,F,B组成,每个字母分别代表Vasechkin撞墙的顺序——左,右,上,下。
撞墙的次数不超过1000.
这个程序员永远不会撞在墙角,并且他的起始位置不会贴在墙上。

输出

Vasechkin从起点到终点所走的长度,保留小数点后四位。

例子

input output
            10 20
9 1
1 19
FLRLRB
52.8015
 
出题人: Pavel Egorov
题来源: 2003年10月11日斯维尔德洛夫斯克州大学生编程公开赛

==============================================================

简单理解就是:给长宽,起点和终点,撞边的情况,最后求的是轨迹的长度。
按下图,做辅助图后,可以比较容易的根据勾股定理求出斜边。

X0,X1,Y0,Y1,W,D这些都是已知的,接下来就是分析碰撞顺序与这些量的关系。

X方向的位移和Y方向的可以分别分析。
X方向的位移规律找出来了,Y方向的位移也是一样的。
不撞墙时:(X0-X1)^2和(X1-X0)^2是一样的,为了跟下面统一,所以把X0写在前面

再分析一下系数的规律:

规律已经比较明显:
X0的系数规律——先往左的时候为正1,先往右的时候为负1。
X1的系数规律——碰撞次数为偶数的时候与X0系数异号,奇数时同号。
W的系数规律——R个数乘以2。

Y方向的规律也是如此。

分析到此,已经可以在程序里面方便的实现这些逻辑了。

下面是我写的代码,如果按照正确格式输入,结果是正确的。
但不知道为什么,提交到ACM系统中报错,也不知道错误是什么,调试不了,我已经是激情殆尽了。哪位朋友如果运行成功了或者发现错误了,一定要告诉我下。
有一个问题,题中要求结果保留4位小数,但我没看出来是“四舍五入”还是“直接舍去”,但我两种都试了,都说答案有误。

下面是代码:

 using System;
namespace ACM1258
{
class Program
{
static void Main()
{
System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture; double result; //输出
double sideX, sideY; //两个直角边
double X0,X1,Y0,Y1,W,D; //各个参数
string flrb; //撞墙顺序
int coeffX0=,coeffX1=,coeffY0=,coeffY1=,coeffW=,coeffD=; //各个系数
bool checkLorR= true,checkForB= true; //是否检查第一个LR、FB
bool LFirst= false,FFirst= false; //判断第一个撞哪边
bool FBpair= true,LRpair=true; //F与B、L与R的个数是否相等; string[] temp;
temp = Console.ReadLine().Split(); //[0]:W [1]:D
W=Convert.ToDouble(temp[]);
D=Convert.ToDouble(temp[]);
temp = Console.ReadLine().Split(); //[0]:X0 [1]:Y0
X0=Convert.ToDouble(temp[]);
Y0=Convert.ToDouble(temp[]);
temp = Console.ReadLine().Split(); //[0]:X1 [1]:Y1
X1=Convert.ToDouble(temp[]);
Y1=Convert.ToDouble(temp[]);
flrb = Console.ReadLine(); for (int i = ; i < flrb.Length; i++)
{
switch (flrb[i])
{
case 'F':
if (checkForB)
{
FFirst = true;
checkForB = false;
}
FBpair = !FBpair;
break;
case 'L':
if (checkLorR)
{
LFirst = true;
checkLorR = false;
}
LRpair = !LRpair;
break;
case 'R':
if (checkLorR)
{
LFirst = false;
checkLorR = false;
}
LRpair = !LRpair;
coeffW++;
break;
case 'B':
if (checkForB)
{
FFirst = false;
checkForB = false;
}
FBpair = !FBpair;
coeffD++;
break;
default:
break;
}
} coeffX0 = LFirst ? : -;
coeffX1 = LRpair ? -coeffX0 : coeffX0;
coeffY0 = FFirst ? : -;
coeffY1 = FBpair ? -coeffY0 : coeffY0; sideX = (coeffX0 * X0 + coeffX1 * X1) + coeffW * * W;
sideY = (coeffY0 * Y0 + coeffY1 * Y1) + coeffD * * D; result = Math.Sqrt(sideX*sideX+sideY*sideY);
//result = ((int)(result * 10000)) / 10000.0; //这是直接舍去的,否则就是四舍五入
Console.WriteLine(result.ToString("F4"));
}
}
}

运行题中的测试用例结果:

[TimusACM][1258]程序员撞墙的问题的更多相关文章

  1. .NET程序员走向高端必读书单汇总

    .NET程序员走向高端必读书单汇总 一.知识树 1. 基本能力 1.1 数学 1.2 英语 1.3 语言表达 2. 计算机组织与体系结构 3. 算法与数据结构 4. 操作系统 5. 计算机网络 6. ...

  2. Github上安卓榜排名第2的程序员教你如何学习【转载,侵删】

    来自:峰瑞资本(微信号:freesvc)文章作者:代码家(微信 ID:daimajia_share) 软件早已吞噬整个世界,程序员是关键角色.过去 40 年中,许多伟大的公司都由程序员缔造,比如比尔· ...

  3. 屌丝程序员的梦想 (二) 屌丝IT梦开始地方

    校区的周围有很多的网吧,一个对电子游戏迷恋了许久的青少年来说,那绝对是不可不去的地方,键盘,鼠标,显示器,那一切看起来都那么完美,那么似曾相识,是啊,魂牵梦绕的IT梦...哦..当时那只是电子游戏梦. ...

  4. 自学android半年,已从.net转型成android程序员,分享下这个过程

    自学从来都是一件难以坚持的事情,看过太多人三分钟热度之后就颓然放弃,然后告诉下一个要自学的人,自学很难,还是正儿八经去培训机构吧 所以首先你要对安卓开发非常感兴趣,发自内心喜欢安卓系统,日常手机如果是 ...

  5. 技术|程序员必须要学会Google搜索技巧

    程序员必须要学会Google搜索技巧 摘要: 因为Google在我天朝被墙,学FQ请通过Bing进行搜索如何FQGoogle搜索技巧我曾经多次劝我的另一个朋友花10分钟学习一下Google通配符的使用 ...

  6. PHP程序员,因该养成 7 个面向对象的好习惯

    在 PHP 编程早期,PHP 代码在本质上是限于面向过程的.过程代码 的特征在于使用过程构建应用程序块.过程通过允许过程之间的调用提供某种程度的重用. 但是,没有面向对象的语言构造,程序员仍然可以把 ...

  7. 【转载】.NET程序员走向高端必读书单汇总

    原文:.NET程序员走向高端必读书单汇总 .NET程序员走向高端必读书单汇总 一.知识树 1. 基本能力 1.1 数学 1.2 英语 1.3 语言表达 2. 计算机组织与体系结构 3. 算法与数据结构 ...

  8. 悲惨的Android程序员

    Android程序员太悲惨了,连Android官网都访问不了,整个Android程序员的水平都被拉低了一个等级.受不了了.说说悲惨的遭遇吧. 起源:高射炮打苍蝇,驴受伤了 Android一个纯技术网站 ...

  9. C#程序员整理的Unity 3D笔记(十):Unity3D的位移、旋转的3D数学模型

    遇到一个想做的功能,但是实现不了,核心原因是因为对U3D的3D数学概念没有灵活吃透.故再次系统学习之—第三次学习3D数学. 本次,希望实现的功能很简单: 如在小地图中,希望可以动态画出Player当前 ...

随机推荐

  1. UVA 12904 Load Balancing 暴力

    Load Balancing Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/vi ...

  2. Codeforces Round #309 (Div. 2) B. Ohana Cleans Up 字符串水题

    B. Ohana Cleans Up Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/554/pr ...

  3. 关于ORACLE DUAL表

    1.DUAL表的用途 Dual 是 Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的Select语句块中--查看当前连接用户 SQL> select user from d ...

  4. 移动端折腾国外分享(facebook、twitter、linkedin)

    一.前言 国内做HTML5页面,关注最多就是微信分享了,之前也写过关于微信分享的文章,可以点击查看:分享相关文章 再者,就是国内的其它分享,比如常用的新浪微博.腾讯微博.QQ空间等等,最方便的就是直接 ...

  5. Android集成支付宝接口 实现在线支付

    手机的在线支付,被认为是2012年最看好的功能,我个人认为这也是移动互联网较传统互联网将会大放光彩的一个功能. 人人有手机,人人携带手机,花钱买东西,不再需要取钱付现,不再需要回家上网银,想买什么,扫 ...

  6. TypeHandler的简单实例

    转自:http://ccchhhlll1988-163-com.iteye.com/blog/1420149 TypeHandler是MyBatis config文件中可选的配置选项,其可以对实体属性 ...

  7. java 图的邻接矩阵

    有向图 在有向图中,结点对<x ,y>是有序的,结点对<x,y>称为从结点x到结点y的一条有向边,因此,<x,y>与<y,x>是两条不同的边.有向图中的 ...

  8. 约瑟夫环问题及python与c++实现效率对比

    约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重 ...

  9. 5. Android框架和工具之 ZXing(二维码)

    Android进阶笔记06:Android 实现扫描二维码实现网页登录

  10. 【开源项目5】测滑菜单MenuDrawer的使用以及解析

    在安卓中左右侧滑菜单的使用用的比ios多得多,可能是谷歌带的头吧,几乎所有的谷歌应用都有侧滑菜单.谷歌没有开放这个源码,在一个成熟的开源代码出现之前,大家都是各自为战,偶尔能看到一个勉强实现了的.Me ...