[TimusACM][1258]程式員撞牆的問題

来源:http://www.cnblogs.com/hollen/archive/2016/10/13/5956117.html
-Advertisement-
Play Games

(本文是從我的舊博客遷移過來的) 問題地址:http://acm.timus.ru/problem.aspx?space=1&num=1258 前幾日在博客園看到這種線上測試的時候,有一種相見恨晚的感覺,於是隨便選了一道感興趣的題(No.1258:Pool)開始做。為了準確瞭解題的意思,我把題翻譯成 ...


(本文是從我的舊博客遷移過來的)


問題地址: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從起點到終點所走的長度,保留小數點後四位。

例子

inputoutput
            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位小數,但我沒看出來是“四捨五入”還是“直接捨去”,但我兩種都試了,都說答案有誤。

下麵是代碼:
 1 using System;
 2 namespace ACM1258
 3 {
 4     class Program
 5     {
 6         static void Main()
 7         {
 8             System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;
 9             
10             double result;    //輸出
11             double sideX, sideY;   //兩個直角邊
12             double X0,X1,Y0,Y1,W,D;   //各個參數
13             string flrb;    //撞牆順序
14             int coeffX0=0,coeffX1=0,coeffY0=0,coeffY1=0,coeffW=0,coeffD=0;  //各個繫數
15             bool checkLorR= true,checkForB= true;  //是否檢查第一個LR、FB
16             bool LFirst= false,FFirst= false;      //判斷第一個撞哪邊
17             bool FBpair= true,LRpair=true;         //F與B、L與R的個數是否相等;
18 
19             string[] temp;
20             temp = Console.ReadLine().Split();               //[0]:W   [1]:D
21             W=Convert.ToDouble(temp[0]);
22             D=Convert.ToDouble(temp[1]);
23             temp = Console.ReadLine().Split();              //[0]:X0  [1]:Y0
24             X0=Convert.ToDouble(temp[0]);
25             Y0=Convert.ToDouble(temp[1]);
26             temp = Console.ReadLine().Split();               //[0]:X1  [1]:Y1
27             X1=Convert.ToDouble(temp[0]);
28             Y1=Convert.ToDouble(temp[1]);
29             flrb = Console.ReadLine();
30             
31             for (int i = 0; i < flrb.Length; i++)
32             {
33                 switch (flrb[i])
34                 {
35                     case 'F':
36                         if (checkForB)
37                         {
38                             FFirst = true;
39                             checkForB = false;
40                         }
41                         FBpair = !FBpair;
42                         break;
43                     case 'L':
44                         if (checkLorR)
45                         {
46                             LFirst = true;
47                             checkLorR = false;
48                         }
49                         LRpair = !LRpair;
50                         break;
51                     case 'R':
52                         if (checkLorR)
53                         {
54                             LFirst = false;
55                             checkLorR = false;
56                         }
57                         LRpair = !LRpair;
58                         coeffW++;
59                         break;
60                     case 'B':
61                         if (checkForB)
62                         {
63                             FFirst = false;
64                             checkForB = false;
65                         }
66                         FBpair = !FBpair;
67                         coeffD++;
68                         break;
69                     default:
70                         break;
71                 }
72             }
73 
74             coeffX0 = LFirst ? 1 : -1;
75             coeffX1 = LRpair ? -coeffX0 : coeffX0;
76             coeffY0 = FFirst ? 1 : -1;
77             coeffY1 = FBpair ? -coeffY0 : coeffY0;
78 
79             sideX = (coeffX0 * X0 + coeffX1 * X1) + coeffW * 2 * W;
80             sideY = (coeffY0 * Y0 + coeffY1 * Y1) + coeffD * 2 * D;
81             
82             result = Math.Sqrt(sideX*sideX+sideY*sideY);
83             //result = ((int)(result * 10000)) / 10000.0;   //這是直接捨去的,否則就是四捨五入
84             Console.WriteLine(result.ToString("F4"));
85         }
86     }
87 }

 

運行題中的測試用例結果:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 當初說這個需求的時候,在網上找了一點資料,但是基本上感覺不符合項目中的需求。參照牛人的項目,和同事的改造,終於是像點樣子了 截圖大致截為3個像素,每個像素使用的地方也不同,考慮圖片不會是很多,分別壓縮保存下來。 根據截取的像素位置,對應的壓縮成相應的圖片: 首先需要下載Jcrop.js與upload ...
  • 最近寫代碼,遇到一個問題,微軟基於List<T>自帶的方法是public bool Remove(T item);,可是有時候我們可能會用到諸如RemoveAll<IEnumerable<T>>的方法,坦白的說,就是傳入的參數是一個IEnumerable<T>,而不是一個T,這種情景是隨時可能用到的 ...
  • 使用C#處理基於比特流的數據 0x00 起因 最近需要處理一些基於比特流的數據,電腦處理數據一般都是以byte(8bit)為單位的,使用BinaryReader讀取的數據也是如此,即使讀取bool型也是一個byte。不過藉助於C#基礎類庫中提供的一些方法,也實現了對基於比特的數據的讀取。任務完成後 ...
  • 初識MVC-controller隨筆 之前用的一些其他框架,也沒有系統性的學習MVC框架。最近才開始接觸,給大家簡單的分享一下經驗。 1 MVC的核心就是Controller(控制器),它負責處理瀏覽器傳送過來的所有請求,並決定要將什麼內容響應給瀏覽器。但Controller並不負責決定內容應該如何 ...
  • 調用百度api微博熱門精選介面,使用了volley,簡單說說volley get的請求方式的使用 header的設置和請求參數的設置,見代碼如下: ...
  • 目錄 1. ApiController 2. HttpActionDescriptor 3. IHttpActionSelector ApiController 在上節中,講到如何選擇並激活對應的IHttpController,而一般我們在開發中使用的是ApiController 在ApiContr ...
  • 編寫MFC程式時,想列印出調試信息,使用cout後,發現程式並沒有像想象中那樣自動彈出命令行視窗,要輸出的信息也沒地方去查看。百度後知道要手動調出命令行視窗,才可以看到輸出的信息。 百度上介紹了兩種方法,一種是通過添加代碼,在程式中建立命令行視窗的對象。這裡介紹一種比較簡單的方法。 右鍵解決方案,打 ...
  • 1、視圖中 2、控制器的action中 3、過濾器中 比如在ActionFilterAttribute中,這個時候一般是自己實現一個繼承類,然後重寫相關的方法。 在重寫的方法中如果需要控制器的名稱。 4、公共方法中 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...