poj1835 模拟(找规律)

2019-11-09  本文已影响0人  暖昼氤氲
/*
Time:2019.11.9
Author: Goven
type:模拟(找规律) 
err:每一次都要转换为绝对位置+绝对朝向 。对于每个朝向,预先得到每次动作将变化为什么朝向(对于朝向2,5比较特殊,
其向上可能有(0,1,3,4)这四种)//err:朝向为0,1,3,4时up同样有4中情况
ref: 解法:https://blog.csdn.net/qq_34731703/article/details/52396225 
*/

//错误版 
#include<iostream>
#include<map>
#include<string>
using namespace std;

int main()
{
    //init
    int d[][3] = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}, {-1, 0, 0}, {0, -1, 0}, {0, 0, -1}};
    int a[][6] = {{2, 5, 4, 1, 3, 0},{2, 5, 0, 3, 4, 1},{0},
    {2, 5, 1, 4, 0, 3},{2, 5, 3, 0, 1, 4},{0}};
    int b[][6] = {{3, 0, 4, 1, 5, 2},{4, 1, 0, 3, 5, 2},{0},{0, 3, 1, 4, 5, 2},{1, 4, 3, 0, 5, 2},{0}};//朝向2的时候
    int c[][6] = {{0, 3, 4, 1, 2, 5},{1, 4, 0, 3, 2, 5},{0},{3, 0, 1, 4, 2, 5},{4, 1, 3, 0, 2, 5},{0}};//朝向5的时候 
    map<string, int> mp;
    mp["up"] = 0; mp["down"] = 1; mp["left"] = 2;
    mp["right"] = 3; mp["back"] = 4; mp["forward"] = 5;
    
    int n, m;
    cin >> n;
    while (n--) {
        cin >> m;
        int status, pos, x[3], dis;
        string str;
        pos = x[0] = x[1] = x[2] = 0;
        while (m--) {
            cin >> str >> dis;
            if (pos != 2 && pos != 5) {
                status = pos;
                pos = a[pos][mp[str]];
            }
            else if(pos == 2){
                pos = b[status][mp[str]];
            }
            else {
                pos = c[status][mp[str]];
            }
            for (int i = 0; i < 3; i++) {
                x[i] += d[pos][i] * dis;
            }
            
        }
        
        printf("%d %d %d %d\n", x[0], x[1], x[2], pos);
    }
    return 0;
}
//正确版
#include<iostream>
#include<map>
#include<string>
using namespace std;

int main()
{
    //init
    int d[][3] = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}, {-1, 0, 0}, {0, -1, 0}, {0, 0, -1}};
    
    int n, m;
    cin >> n;
    while (n--) {
        cin >> m;
        int x[3] = {0};
        int t, dis, forward = 0, up = 2, left = 4;
        string str;
        while (m--) {
            cin >> str >> dis;
            if (str[0] == 'u') {
                t = forward;
                forward = up;
                up = (t + 3) % 6;
            }
            else if (str[0] == 'd') {
                t = forward;
                forward = (up + 3) % 6;
                up = t;
            }
            else if (str[0] == 'b') {
                forward = (forward + 3) % 6;
                left = (left + 3) % 6;
            }
            else if (str[0] == 'l') {
                t = forward;
                forward = left;
                left = (t + 3) % 6;
            }
            else if (str[0] == 'r') {
                t = forward;
                forward = (left + 3) % 6;
                left = t;
            }
            
            for (int i = 0; i < 3; i++)
                x[i] += d[forward][i] * dis;
        }
        
        printf("%d %d %d %d\n", x[0], x[1], x[2], forward);
    }
    return 0;
} 

上一篇 下一篇

猜你喜欢

热点阅读