874. Simulieren Sie die Laufrobotersimulation + Hash-Speicherung

Themen-Link-Link

Der Roboter läuft auf einer XY-Gitterebene von unendlicher Größe,  (0, 0) beginnend an einem Punkt, der nach Norden zeigt. Der Roboter kann die folgenden drei Arten von Befehlen empfangen  commands :

  • -2 :  90 links abbiegen
  • -1 :  90 rechts abbiegen
  • 1 <= x <= 9x : Einheitslänge  nach vorne  verschieben

Einige Zellen im Raster gelten als Hindernisse  obstacles . Das erste  i Hindernis befindet sich am Rasterpunkt   obstacles[i] = (xi, yi) .

Der Roboter kann nicht zu dem Hindernis laufen, er bleibt auf dem vorherigen Planquadrat des Hindernisses, kann aber weiterhin versuchen, den Rest der Route zu bewältigen.

Gibt das Quadrat des größten euklidischen Abstands vom Ursprung zu allen vom Roboter passierten Pfadpunkten zurück (mit ganzzahligen Koordinaten). (d. h.  5 Rückkehr  , wenn die Entfernung ist 25 )

Beachten:

  • Norden gibt  +Y die Richtung an.
  • Osten bedeutet  +X Richtung.
  • Süden gibt  -Y die Richtung an.
  • Der Westen gibt  -X die Richtung an.

Beispiel 1:

Eingabe: Befehle = [4,-1,3], Hindernisse = []
 Ausgabe: 25
 Erläuterung:
 Roboter startet bei (0, 0):
1. Bewegen Sie 4 Einheiten nach Norden, um (0, 4) zu erreichen.
2. Biegen Sie rechts ab
3. Bewegen Sie 3 Einheiten nach Osten, um (3, 4) zu erreichen.
Am weitesten vom Ursprung entfernt ist (3, 4), der Abstand beträgt 32 + 42 = 25

Beispiel 2:

Eingabe: Befehle = [4,-1,4,-2,4], Hindernisse = [[2,4]]
 Ausgabe: 65
 Erläuterung : Roboter startet bei (0, 0):
1. Bewegen Sie 4 Einheiten nach Norden, um (0, 4) zu erreichen.
2. Biegen Sie rechts ab
3. Der Roboter bewegt sich 1 Einheit nach Osten und wird dann von einem Hindernis bei (2, 4) blockiert. Er stoppt bei (1, 4).
4. Biegen Sie links ab
5. Gehen Sie 4 Einheiten nach Norden bis (1, 8)
Am weitesten vom Ursprung entfernt ist (1, 8), der Abstand beträgt 12 + 82 = 65

Gedankengang 

Das Thema ist eine Simulation, bei der ein Punkt zur Darstellung (x, y, Richtung) verwendet wird, um die horizontalen und vertikalen Koordinaten bzw. die Richtung des Punktes darzustellen. Da es Hindernisse gibt, prüfen Sie jedes Mal, wenn Sie sich bewegen, jedes Mal, wenn Sie sich einen Schritt bewegen, ob sich an den aktuellen (x, y)-Koordinaten ein Hindernis befindet, und halten Sie an, wenn dies der Fall ist. Hindernisse werden in einer Hash-Struktur gespeichert.

  typedef struct point{
        int x ; 
        int y ; 
        int direction ; // 0 , 1, 2, 3 北,东,南,西
    }Point;
    int robotSim(vector<int>& commands, vector<vector<int>>& obstacles) {
        // 初始化起点,方向
        int dx[4] = {1,0,-1,0};
        int dy[4] = {0,-1,0,1};
        Point p ; 
        p.x = 0 ; 
        p.y = 0 ;
        p.direction = 3 ; 

        // 用哈希记录 障碍物 

        set<pair<int,int>> vis ; 
        for(auto & i : obstacles){
            vis.emplace(i[0],i[1]) ; 
        }
        int ans = 0 ; 
        
        for(int i = 0 ; i<commands.size() ; i++ ){
            
            if(commands[i] ==-2 ){
                // 左转
                p.direction= (p.direction-1+4)%4 ; 
            }else if (commands[i] ==-1){
                // 右转
                p.direction= (p.direction+1)%4 ; 
            }else{
                int step = commands[i] ; 
                for(int i = 0 ; i<step; i++ ){
                    int nx = p.x +dx[p.direction] ; 
                    int ny = p.y +dy[p.direction] ; 
                    if(vis.count({nx,ny})) {
                        break ; 
                    }
                    p.x = nx ; 
                    p.y = ny ;
                    ans = max(ans , p.x*p.x +p.y*p.y);
                }
                
                
            }
        }
        return ans ; 
    }

expandieren

Häufige Verwendung von pair<int,int>
 

1. erstellen

pair<int, int> myPair(3, 7);

2. Holen Sie sich pair<int, int>das erste und zweite Element

pair<int, int> myPair(3, 7);
int firstElement = myPair.first;  // 获取第一个元素,值为3
int secondElement = myPair.second;  // 获取第二个元素,值为7

3. Geänderter pair<int, int>Wert

myPair.first = 10;  // 修改第一个元素的值为10
myPair.second = 20;  // 修改第二个元素的值为20

4. Verwenden Sie pair<int, int>das Element als Container:

vector<std::pair<int, int>> myVector;
myVector.push_back(std::make_pair(3, 7));  // 将一个pair<int, int>对象添加到vector中

map<std::string, std::pair<int, int>> myMap;
myMap["key"] = std::make_pair(3, 7);  // 将一个pair<int, int>对象关联到一个字符串键上

Guess you like

Origin blog.csdn.net/qq_41661809/article/details/131812051