题目链接: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;
}
};