件名の説明:
二次元マトリックス、小文字はキー大文字に対応しています。ドアが会ったとき、壁やドアがありますが、ない壁を貫通して、唯一の過去への鍵を持っています。Q.少なくともすべてのキーを取得するには多くのステップを取ります。
アイデア:
BFS、それは同じレコードBFS普通のようなステップの数、各場所を開始しました。その後、数字キーをマークしようとします。
オリジナルのマークは、すべてのキーを取得することです。。。。6つの主要の唯一最大の現在のビット操作はそのキーを持っているかどうかを決定するために使用することができるからです。
コード:
class Solution {
public:
struct Node {
int x, y;
int status;
Node(int x = 0, int y = 0, int status = 0) {
this->x = x;
this->y = y;
this->status = status;
}
};
int shortestPathAllKeys(vector<string>& grid) {
int cnt = 0;
int n = grid.size();
int m = grid[0].length();
int stx, sty;
for (int i=0; i<n; ++i) {
for (int j=0; j<m; ++j) {
if (grid[i][j] >= 'a' && grid[i][j] <= 'z') {
cnt = max(cnt, grid[i][j] - 'a' + 1);
}
if (grid[i][j] == '@') {
stx = i, sty = j;
}
}
}
queue<Node> que;
que.push(Node(stx, sty, 0));
vector<vector<vector<int>> > step(n, vector<vector<int>>(m, vector<int>(1<<6, INT_MAX)));
step[stx][sty][0] = 0;
map<char, int> mp;
int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
while(!que.empty()) {
Node cur = que.front();
int curx = cur.x;
int cury = cur.y;
int curstu = cur.status;
que.pop();
if (curstu == (1<<cnt)-1 ) return step[curx][cury][curstu];
for (int i=0; i<4; ++i) {
int nxtx = curx + dir[i][0];
int nxty = cury + dir[i][1];
if (nxtx < 0 || nxtx >= n || nxty < 0 || nxty >= m) continue;
char nxt_ch = grid[nxtx][nxty];
if (nxt_ch == '#') continue;
if (nxt_ch >= 'a' && nxt_ch <= 'z') {
int tkey = nxt_ch-'a';
int nxtstu = curstu | (1<<tkey);
if (step[nxtx][nxty][nxtstu] > step[curx][cury][curstu] + 1) {
que.push(Node(nxtx, nxty, nxtstu));
step[nxtx][nxty][nxtstu] = step[curx][cury][curstu] + 1;
}
}
if ((nxt_ch == '.' || nxt_ch =='@') && step[nxtx][nxty][curstu] > step[curx][cury][curstu] + 1) {
que.push(Node(nxtx, nxty, curstu));
step[nxtx][nxty][curstu] = step[curx][cury][curstu] + 1;
}
if (nxt_ch >= 'A' && nxt_ch <= 'Z') {
int key = nxt_ch - 'A';
if ((curstu & (1<<key)) && step[nxtx][nxty][curstu] > step[curx][cury][curstu] + 1) {
que.push(Node(nxtx, nxty, curstu));
step[nxtx][nxty][curstu] = step[curx][cury][curstu] + 1;
}
}
}
}
return -1;
}
};
朝:私は、キビのブレスレットをしたいと思います。
経験豊富1sが完売しました。