个人练习-Leetcode-1138. Alphabet Board Path

题目链接:https://leetcode.cn/problems/alphabet-board-path/

题目大意:给出一个网格board[][],里面放了如题图的字母。起始点为左上角board[0][0],现给出一个字符串,要求给出一串操作,打印出这个字符串。其中UDLR分别表示上下左右移动1格,!表示打印当前位置的字符。

思路:直接模拟就完事,无非就是从这个字符走到那个字符。但注意点是,z这个字符在第6行,并且第6行只有这一个字符,也就是说第6行其他的位置都是非法的。设竖直为x坐标,水平为y坐标。如果【出发点是z,要先移动x坐标】,如果【终点是z,要先移动y坐标】

   string findChar(char target_c, char now_c) {
        if (target_c == now_c)
            return "!";

        string ret = "";
        pair<int, int> pos = getLetter(now_c);
        pair<int, int> dest = getLetter(target_c);
        int diff_x = dest.first - pos.first;
        int diff_y = dest.second - pos.second;
        

        if (now_c == 'z') {
            processX(ret, diff_x);
            processY(ret, diff_y);
        }
        else {
            processY(ret, diff_y);
            processX(ret, diff_x);
        }

        ret += "!";

        return ret;
    }

至于字母和坐标的转换,建议直接打表,比计算快多了。

完整代码

class Solution {
public:
    pair<int, int> getLetter(char c) {
        switch(c) {
            case 'a': return make_pair<int, int>(0, 0);
            case 'b': return make_pair<int, int>(0, 1);
            case 'c': return make_pair<int, int>(0, 2);
            case 'd': return make_pair<int, int>(0, 3);
            case 'e': return make_pair<int, int>(0, 4);
            case 'f': return make_pair<int, int>(1, 0);
            case 'g': return make_pair<int, int>(1, 1);
            case 'h': return make_pair<int, int>(1, 2);
            case 'i': return make_pair<int, int>(1, 3);
            case 'j': return make_pair<int, int>(1, 4);
            case 'k': return make_pair<int, int>(2, 0);
            case 'l': return make_pair<int, int>(2, 1);
            case 'm': return make_pair<int, int>(2, 2);
            case 'n': return make_pair<int, int>(2, 3);
            case 'o': return make_pair<int, int>(2, 4);
            case 'p': return make_pair<int, int>(3, 0);
            case 'q': return make_pair<int, int>(3, 1);
            case 'r': return make_pair<int, int>(3, 2);
            case 's': return make_pair<int, int>(3, 3);
            case 't': return make_pair<int, int>(3, 4);
            case 'u': return make_pair<int, int>(4, 0);
            case 'v': return make_pair<int, int>(4, 1);
            case 'w': return make_pair<int, int>(4, 2);
            case 'x': return make_pair<int, int>(4, 3);
            case 'y': return make_pair<int, int>(4, 4);
            default: return make_pair<int, int>(5, 0);
        }
    }

    string processX(string& ret, int diff_x) {
        if (diff_x > 0) {
            string tmp(diff_x, 'D');
            ret += tmp;
        }
        else if (diff_x < 0) {
            string tmp(-diff_x, 'U');
            ret += tmp;
        }
        else;
        return ret;
    }

    string processY(string& ret, int diff_y) {
        if (diff_y > 0) {
            string tmp(diff_y, 'R');
            ret += tmp;
        }
        else if (diff_y < 0) {
            string tmp(-diff_y, 'L');
            ret += tmp;
        }
        else;
        return ret;
    }


    string findChar(char target_c, char now_c) {
        if (target_c == now_c)
            return "!";

        string ret = "";
        pair<int, int> pos = getLetter(now_c);
        pair<int, int> dest = getLetter(target_c);
        int diff_x = dest.first - pos.first;
        int diff_y = dest.second - pos.second;
        

        if (now_c == 'z') {
            processX(ret, diff_x);
            processY(ret, diff_y);
        }
        else {
            processY(ret, diff_y);
            processX(ret, diff_x);
        }

        ret += "!";

        return ret;
    }

    string alphabetBoardPath(string target) {
        string ret = "";
        pair<int, int> pos(0, 0);
        char now_c = 'a';
        for (int i = 0; i < target.length(); i++) {
            char target_c = target[i];
            ret += findChar(target_c, now_c);
            now_c = target_c;
        }
        return ret;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值