結果
問題 | No.124 門松列(3) |
ユーザー |
![]() |
提出日時 | 2016-09-20 23:33:36 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 4 ms / 5,000 ms |
コード長 | 1,480 bytes |
コンパイル時間 | 752 ms |
コンパイル使用メモリ | 78,196 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-11-17 10:16:34 |
合計ジャッジ時間 | 1,725 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 26 |
ソースコード
#include <iostream>#include <vector>#include <cstring>#include <algorithm>#include <queue>#include <map>using namespace std;int W, H;int DP[101][101][4];int dx[4] = { 0,1,0,-1 };int dy[4] = { -1,0,1,0 };vector<vector<int> >M;void bfs() {for (int i = 0; i < 101; i++)for (int j = 0; j < 101; j++)for (int k = 0; k < 4; k++)DP[i][j][k] = INT32_MAX;DP[0][1][0] = 1;DP[1][0][3] = 1;queue<pair<int,int> > que;que.push(make_pair(W,0));que.push(make_pair(1,3));while (!que.empty()) {pair<int,int> v = que.front(); que.pop();int y = v.first / W;int x = v.first % W;int p_y = y + dy[v.second];int p_x = x + dx[v.second];for (int i = 0; i < 4; i++) {int n_y = y + dy[i];int n_x = x + dx[i];if (n_x<0 || n_y<0 || n_x>=W || n_y>=H)continue;if (DP[n_x][n_y][(i + 2) % 4] <= DP[x][y][v.second] + 1)continue;if (M[y][x] == M[p_y][p_x] || M[y][x] == M[n_y][n_x] || M[p_y][p_x]==M[n_y][n_x])continue;if((M[p_y][p_x]<M[y][x]&&M[y][x]<M[n_y][n_x])|| (M[p_y][p_x] > M[y][x] && M[y][x] > M[n_y][n_x]))continue;DP[n_x][n_y][(i + 2) % 4] = DP[x][y][v.second] + 1;que.push(make_pair(W*n_y + n_x, (i + 2) % 4));}}}int main(){cin >> W >> H;M.resize(H);for (int i = 0; i < H; i++) {M[i].resize(W);for (int j = 0; j < W; j++) {cin >> M[i][j];}}bfs();int ans = min(DP[W - 1][H - 1][0], DP[W - 1][H - 1][3]);if (ans == INT32_MAX)cout << -1 << endl;else cout << ans << endl;return 0;}