我正在尝试使用枚举将字符串中的一些字符映射到一些整数值。请告诉我我要去哪里错了?
enum moves{U,R,D,L};
class Solution {
public:
bool judgeCircle(string moves) {
// moves is a string having values like ULLDDRR, ULRD, UULLDDRR
int X[] = {0,1,0,-1};
int Y[] = {1,0,-1,0};
// while iterating the string if a get 'U' , I want it to use as an index
//with U representing 0th index, R as index=1 and so on.. as in enum
int x=0 , y=0;
enum moves ind;
for( int i = 0 ; i < moves.length() ; i++ ) {
ind = moves[i]; // but this line here gives error
x += X[ind];
y += Y[ind];
}
if(!x && !y)
return true;
else
return false;
}
};
答案 0 :(得分:2)
我会用enum
放弃这个想法,因为我觉得它对实际的问题没有用-将字符映射到导航动作。为此,我将使用std::map
或std::unordered_map
。 (考虑到只有4个条目,性能差异可能很难衡量。)
在我准备示例代码时,πάντα ῥεῖ给出了类似的提示。不过,我什至建议将x和y的动作捆绑在一起:
#include <map>
#include <iomanip>
#include <iostream>
// bundle x and y for a move (which needs both of them)
struct Move {
int dx, dy;
};
// a type to map chars to moves
using MoveMap = std::map<char, Move>;
// a pre-defined move map
static const MoveMap mapMoves = {
{ 'U', { 0, 1 } },
{ 'R', { 1, 0 } },
{ 'D', { 0, -1 } },
{ 'L', { -1, 0 } }
};
/* a function to use move map
*
* id ... one of U R D L
* x, y ... coordinates (update)
* return: true if successful, (false e.g. for wrong id)
*/
bool move(char id, int &x, int &y)
{
const MoveMap::const_iterator iter = mapMoves.find(id);
return iter != mapMoves.end()
? x += iter->second.dx, y += iter->second.dy, true
: false;
}
// check it out:
int main()
{
int x = 0, y = 0;
const char test[] = "ULLDDRR, ULRD, UULLDDRR";
for (char id : test) {
std::cout << "(" << x << ", " << y << "): "
<< "Move '" << id << "' -> ";
if (move(id, x, y)) {
std::cout << "(" << x << ", " << y << ")\n";
} else std::cout << "failed\n";
}
return 0;
}
输出:
(0, 0): Move 'U' -> (0, 1)
(0, 1): Move 'L' -> (-1, 1)
(-1, 1): Move 'L' -> (-2, 1)
(-2, 1): Move 'D' -> (-2, 0)
(-2, 0): Move 'D' -> (-2, -1)
(-2, -1): Move 'R' -> (-1, -1)
(-1, -1): Move 'R' -> (0, -1)
(0, -1): Move ',' -> failed
(0, -1): Move ' ' -> failed
(0, -1): Move 'U' -> (0, 0)
(0, 0): Move 'L' -> (-1, 0)
(-1, 0): Move 'R' -> (0, 0)
(0, 0): Move 'D' -> (0, -1)
(0, -1): Move ',' -> failed
(0, -1): Move ' ' -> failed
(0, -1): Move 'U' -> (0, 0)
(0, 0): Move 'U' -> (0, 1)
(0, 1): Move 'L' -> (-1, 1)
(-1, 1): Move 'L' -> (-2, 1)
(-2, 1): Move 'D' -> (-2, 0)
(-2, 0): Move 'D' -> (-2, -1)
(-2, -1): Move 'R' -> (-1, -1)
(-1, -1): Move 'R' -> (0, -1)
(0, -1): Move '' -> failed