CSU 1510 Happy Robot DP

来源:互联网 发布:软件测试简历模板 编辑:程序博客网 时间:2024/06/05 11:42

Happy Robot

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 147  Solved: 68
[Submit][Status][Web Board]

Description

Input

There will be at most 1000 test cases. Each case contains a command sequence with no more than 1000 characters.

Output

For each test case, print the case number, followed by minimal/maximal possible x (in this order), then the minimal/maximal possible y.

Sample Input

F?FL??LFFFRF

Sample Output

Case 1: 1 3 -1 1Case 2: -1 1 0 2Case 3: 1 1 3 3

点击打开题目链接

机器人执行指令,可以前进,左转,右转。

主要是对 ‘?’ 特殊处理

结构体DP[ d ][ i ] 保存当前方向为DIRS[ d ] ,剩下 i 个指令要执行,所取得的X,Y的最大最小值。

#include <cstdio>#include <cstring>#include <cassert>#include <cstdlib>#include <iostream>using namespace std;struct Point{    int x, y;    Point(int x = 0, int y = 0) : x(x), y(y) {}};typedef Point Vector;const int MAXN = 1000 + 5;char CMD[MAXN];Vector DIRS[4];int n;void init(){    DIRS[0].x = 1;  //向右    DIRS[0].y = 0;    DIRS[1].x = 0;  //向上    DIRS[1].y = 1;    DIRS[2].x = -1; //向左    DIRS[2].y = 0;    DIRS[3].x = 0;  //向下    DIRS[3].y = -1;}struct Ans{    int minX, minY, maxX, maxY;    Ans& update(const Ans& a)       //更新X,Y的最大,最小值    {        minX = min(minX, a.minX);        minY = min(minY, a.minY);        maxX = max(maxX, a.maxX);        maxY = max(maxY, a.maxY);        return *this;    }    Ans operator + (const Vector& v) const  //重载“+”运算符    {        Ans a = *this;        a.minX += v.x;        a.maxX += v.x;        a.minY += v.y;        a.maxY += v.y;        return a;    }};// DP(d, i) 表示当前方向为DIRS中的(0,1,2,3),剩下i个指令要执行,X,Y分别能走出的差量Ans DP[4][MAXN];int main(){    //freopen("in.txt", "r", stdin);    init();    for (int t = 1; scanf("%s", &CMD) == 1; t++)    {        n = strlen(CMD);        memset(DP, 0, sizeof(DP));        for (int i = 1; i <= n; i++)   // 还剩i个指令        {            char c = CMD[n - i];            for (int d = 0; d < 4; d++)   // 当前的方向            {                Ans& a = DP[d][i];                Ans al = DP[(d + 1) % 4][i - 1],    //上一个指令,左转                    ar = DP[(d - 1 + 4) % 4][i - 1],    //上一个指令,右转                    af = DP[d][i - 1] + DIRS[d];        //上一个指令,前进                if (c == 'L') a = al;       //判断是什么指令                else if (c == 'R') a = ar;                else if (c == 'F') a = af;                else                {                    assert(c == '?');   //如果是‘?’                    a = al.update(ar).update(af);   //更新最值                }            }        }        Ans& a = DP[0][n];        printf("Case %d: %d %d %d %d\n", t, a.minX, a.maxX, a.minY, a.maxY);    }    return 0;}


0 0
原创粉丝点击