zoukankan      html  css  js  c++  java
  • [POJ1801]Formula Racing(模拟)

    Formula Racing
    Time Limit: 1000MS   Memory Limit: 30000K
    Total Submissions: 289   Accepted: 77

    Description

    Background
    The brand new formula racing team Irarref needs your help! Irarref doesn't have any real good drivers but they want to dominate formula racing. Since fairness doesn't mean anything to them they are trying to build a fully automatic driving control which needs almost no driver interaction.
    Before actually trying the automatic driving control on track and risking to crash their precious cars (they don't care much about their drivers), they want to test it in a computer simulation.
    Problem
    You have to simulate the movement of a car on a given track. To simplify the problem, cars can only move in 8 directions (horizontal, vertical, and diagonal) on cells of a regular 2-dimensional grid, where directions are encoded as follows:
    701
    6 2
    543

    Every turn the car executes exactly one of the following commands:
    command description
    move-on keep moving with the current speed and direction
    accelerate increase the speed by 1
    brake decrease the speed by 1 (does not go below 0!)
    left turn 45 degrees left (decrease direction by 1)
    right turn 45 degrees right (increase direction by 1)

    In any case, a car moves its speed value in cells in its current direction and crosses all cells in-between its old and new position. When a car accelerates or brakes, its speed is adjusted before the movement of the current turn. When a car turns, its direction is changed before the movement.
    The racing track is a 2-dimensional regular grid, where every cell can be: road, non-road space (but still drivable), start/goal line (also road and drivable), or wall.
    Every car starts with an initial speed of 0 and has a maximum speed which it cannot exceed. When a car hits non-road space its speed is reduced to 1 in the next turn but it completes the move of this turn with its current speed. When a car hits a wall it crashes, the simulation stops immediately and there will be no next turn.
    Every car is alone on the track, so you do not have to check for car/car collisions.

    Input

    The first line contains the number of scenarios.
    For each scenario, the first line contains width w and height h of the racing track (1 <= w, h <= 1000).The following h lines contain the layout of the racing track where road, non-road-space, start/goal line, and wall are represented by "x", ".", "s", and "W", respectively. The upper left corner of the racing area is (0, 0), the lower right corner (w-1, h-1), where coordinates are given as pairs (x, y) where x-direction is horizontal and y-direction is vertical.
    A line containing the number n of cars to simulate follows the track description. For every car there are two lines:
    • a line containing the initial x- and y-coordinate x and y, direction d, and maximum speed m of the car, as integers separated by single blanks, where 0 <= x <= w-1, 0 <= y <= h-1, 0 <= d <= 7, 1 <= m
    • a line containing a string whose single characters each encode one command for this car, where "m","a", "b", "l", and "r" represent move-on, accelerate, brake, left, and right, respectively; the number of commands for a car is at least 1 and at most 10000.

    It is guaranteed that the initial car position is not on a wall. It is also guaranteed that the car does not leave the track area without crashing.

    Output

    The output for every scenario begins with a line containing "Scenario #i:", where i is the number of the scenario starting at 1. For every scenario print for ever car the following information:
    • If the car did not crash print a line containing the final position (x- and y-coordinate), direction and speed of the car, all separated by single spaces.If the car did crash print a line containing the crash-point (x- and y-coordinate), direction and speed of the car at the moment of the crash and the word "crashed", all separated by single spaces.
    • For every hit of a start/goal field (a hit is counted when moving onto a start/goal field) print a line beginning with "crossing startline:", followed by a single space, the x- and y-coordinates,direction, speed and the number of the simulation turn the line was crossed or hit. The lines must be printed in the same order the start/goal fields were hit.

    Print a blank line after each scenario.

    Sample Input

    1
    12 12
    WWWWWWWWWWWW
    W...xxxx...W
    W..xxxxxx..W
    W.xxWWWWxx.W
    WxxWW..WWxxW
    WxxW....WxxW
    WssW....WxxW
    WxxWW..WWxxW
    W.xxWWWWxx.W
    W..xxxxxx..W
    W...xxxx...W
    WWWWWWWWWWWW
    2
    1 6 0 3
    armmrarrmrrrbrmmb
    1 5 0 4
    ararmrramrmar

    Sample Output

    Scenario #1:
    2 4 0 0
    crossing startline: 2 6 0 1 13
    5 11 5 2 crashed

    Source

    TUD Programming Contest 2004, Darmstadt, Germany

    [Submit]   [Go Back]   [Status]   [Discuss]

    英文阅读题。1h读懂题,10min写完。

    纯模拟,看网上没有代码就发一份吧。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 using namespace std;
     5 
     6 const int N=1010;
     7 int n,m,T,mx,tot,times,x,y,d,mn,speed,len;
     8 char op[N],mp[N][N];
     9 const int dx[8]={0,1,1,1,0,-1,-1,-1},dy[8]={-1,-1,0,1,1,1,0,-1};
    10 struct P{ int x,y,d,speed,id; }p[N*N];
    11 
    12 void up(int &x){ if (x<mx) x++; }
    13 void dn(int &x){ if (x) x--; }
    14 
    15 int main(){
    16     scanf("%d",&T);
    17     for (int cas=1; cas<=T; cas++){
    18         scanf("%d%d",&n,&m); printf("Scenario #%d:
    ",cas);
    19         for (int i=0; i<n; i++) scanf("%s",mp[i]);
    20         scanf("%d",&times);
    21         for (int tt=0; tt<times; tt++){
    22             scanf("%d%d%d%d",&x,&y,&d,&mx);
    23             speed=tot=0; bool cr=0;
    24             scanf("%s",op); len=strlen(op);
    25             for (int i=0; i<len; i++){
    26                 if (op[i]=='a') up(speed);
    27                 if (op[i]=='b') dn(speed);
    28                 if (op[i]=='l') d=(d+7)%8;
    29                 if (op[i]=='r') d=(d+1)%8;
    30                 bool flag=0;
    31                 for (int j=0; j<speed; j++){
    32                     x+=dx[d]; y+=dy[d];
    33                     if (mp[y][x]=='.') flag=1;
    34                     if (mp[y][x]=='W') { printf("%d %d %d %d crashed
    ",x,y,d,speed); cr=1; break; }
    35                     if (mp[y][x]=='s') p[tot++]=(P){x,y,d,speed,i};
    36                 }
    37                 if (flag) speed=1;
    38                 if (cr) break;
    39             }
    40             if (!cr) printf("%d %d %d %d
    ",x,y,d,speed);
    41             for (int i=0; i<tot; i++) printf("crossing startline: %d %d %d %d %d
    ",p[i].x,p[i].y,p[i].d,p[i].speed,p[i].id);
    42         }
    43         puts("");
    44     }
    45     return 0;
    46 }
  • 相关阅读:
    如何在Nginx下配置PHP程序环境
    Nginx服务器不支持PATH_INFO的问题及解决办法
    php内置函数分析之str_pad()
    php常用几种设计模式的应用场景
    func_get_args()在php71与php56的区别
    Restful api 防止重复提交
    Game-Tech小游戏专场第二趴,这次帝都见
    入门系列之在Ubuntu上使用MySQL设置远程数据库优化站点性能
    入门系列之在Ubuntu上使用Netdata设置实时性能监控
    叶聪:朋友圈背后的计算机视觉技术与应用
  • 原文地址:https://www.cnblogs.com/HocRiser/p/8921061.html
Copyright © 2011-2022 走看看