Как сопоставить значения char с int, используя enum - PullRequest
0 голосов
/ 01 июня 2019

Я пытаюсь сопоставить некоторые символы в строке с некоторыми целочисленными значениями, используя enum.Пожалуйста, скажите, где я иду не так?

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 I get a 'U' , I want to use it as an index 
//with  U representing the 0th index, R as index=1 and so on.. as specified 
 //in the 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;
    }
};

1 Ответ

2 голосов
/ 01 июня 2019

Я бы отбросил идею с 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

Живая демоверсия на coliru

...