아래와 같은 키보드 레이아웃이 있다고 가정합니다. -
A | 나 | C | 디 | 이 | F |
지 | ㅎ | 나 | 제 | 케이 | 엘 |
남 | N | 오 | 피 | 질문 | R |
S | 티 | U | V | 여 | X |
예 | Z | | | | |
각 영문 대문자가 어떤 좌표에 위치하는 경우, 예를 들어 문자 A는 (0,0)에, 문자 B는 (0,1)에, 문자 P는 (2,3)에 배치됩니다. 문자 Z는 (4,1)에 배치됩니다. 이제 단어가 있는 경우 두 손가락만 사용하여 이러한 문자열을 입력할 수 있는 최소 총 거리를 찾아야 합니다. 두 위치 (x1,y1)과 (x2,y2) 사이의 거리는 |x1 - x2| + |y1 - y2|. 그리고 키보드의 어느 위치에서나 시작할 수 있습니다.
따라서 입력이 "HAPPY"와 같으면 출력은 H로 시작하므로 비용은 0, A, 따라서 H에서 A까지의 비용은 2, 그 다음 P이므로 비용은 0이 되고 다시 6이 됩니다. P, 비용은 0, 마지막으로 Y이므로 P에서 Y까지의 비용은 4이므로 총 비용은 6 + 4 =10입니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
하나의 지도 메모 정의
-
getHash() 함수를 정의하면 a, b, c, d, e,
가 필요합니다. -
온도 :=0
-
a가 0이 아닌 동안 −
-
temp :=temp * 10 + 모드 10, a :=a / 10
-
-
b가 0이 아닌 동안 수행 -
-
온도 :=온도 * 10 + b 모드 10, b :=b / 10
-
-
c가 0이 아닌 동안 수행 -
-
temp :=temp * 10 + d mod 10, d :=d / 10
-
-
e가 0이 아닌 동안 수행
-
온도 :=온도 * 10 + 전자 모드 10, 전자 :=전자 / 10
-
-
반환 온도
-
하나의 메소드 getXY()를 정의합니다. 이것은 c
가 걸립니다.-
한 쌍의 ret 정의
-
a :=c - 'A'의 ASCII
-
ret.second :=모드 6
-
ret.first :=a / 6
-
리턴 렛
-
-
getDist() 함수를 정의하면 a, b, c, d,
가 필요합니다. -
a가 -1과 같고 b가 -1과 같으면 -
-
0 반환
-
-
반환 |(b - d) + |a - c||
-
solve() 함수를 정의하면 x1, y1, x2, y2, word, idx,
가 필요합니다. -
idx가 단어의 크기와 같으면 -
-
0 반환
-
-
상태 :=getHash(x1 + 2, y1 + 2, x2 + 2, y2 + 2, idx + 2)
-
상태가 메모에 있는 경우 -
-
회신 메모[상태]
-
-
한 쌍의 temp 정의 :=getXY(word[idx])
-
답변 :=0
-
A :=getDist(x1, y1, temp.first, temp.second + solve(temp.first, temp.second, x2, y2, word, idx + 1))
-
B :=getDist(x2, y2, temp.first, temp.second + solve(x1, y1, temp.first, temp.second, word, idx + 1))
-
as :=A와 B의 최소값
-
반환 메모[상태] =as
-
주요 방법에서 다음을 수행하십시오 -
-
해결 반환(-1, -1, -1, -1, 단어, 0)
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
#include <bits/stdc++.h> using namespace std; class Solution { public: map<int, int> memo; int getHash(int a, int b, int c, int d, int e){ int temp = 0; while (a) { temp = temp * 10 + a % 10; a /= 10; } while (b) { temp = temp * 10 + b % 10; b /= 10; } while (c) { temp = temp * 10 + c % 10; c /= 10; } while (d) { temp = temp * 10 + d % 10; d /= 10; } while (e) { temp = temp * 10 + e % 10; e /= 10; } return temp; } pair<int, int> getXY(char c){ pair<int, int> ret; int a = c - 'A'; ret.second = a % 6; ret.first = a / 6; return ret; } int getDist(int a, int b, int c, int d){ if (a == -1 && b == -1) return 0; return abs(b - d) + abs(a - c); } int solve(int x1, int y1, int x2, int y2, string word, int idx){ if (idx == word.size()) return 0; int state = getHash(x1 + 2, y1 + 2, x2 + 2, y2 + 2, idx + 2); if (memo.find(state) != memo.end()) return memo[state]; pair<int, int> temp = getXY(word[idx]); int ans = 0; int A = getDist(x1, y1, temp.first, temp.second) + solve(temp.first, temp.second, x2, y2, word, idx + 1); int B = getDist(x2, y2, temp.first, temp.second) + solve(x1, y1, temp.first, temp.second, word, idx + 1); ans = min(A, B); return memo[state] = ans; } int minimumDistance(string word){ memo.clear(); return solve(-1, -1, -1, -1, word, 0); } }; main(){ Solution ob;; cout << (ob.minimumDistance("HELLO")); }
입력
"HELLO"
출력
4