結果
問題 | No.340 雪の足跡 |
ユーザー |
|
提出日時 | 2016-01-29 22:49:23 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 545 ms / 1,000 ms |
コード長 | 3,029 bytes |
コンパイル時間 | 1,368 ms |
コンパイル使用メモリ | 118,704 KB |
実行使用メモリ | 39,552 KB |
最終ジャッジ日時 | 2024-09-21 18:27:02 |
合計ジャッジ時間 | 8,822 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 5 |
other | AC * 32 |
ソースコード
#include <cstdio>#include <iostream>#include <sstream>#include <fstream>#include <iomanip>#include <algorithm>#include <cmath>#include <string>#include <vector>#include <list>#include <queue>#include <stack>#include <set>#include <map>#include <bitset>#include <numeric>#include <limits>#include <climits>#include <cfloat>#include <functional>using namespace std;int minDist(const vector<string>& plane, char wall, int y1, int x1, int y2, int x2){int dy[] = {0, 0, -1, 1};int dx[] = {-1, 1, 0, 0};int h = plane.size();int w = plane[0].size();queue<pair<int, int> > q;vector<vector<bool> > check(h, vector<bool>(w, false));q.push(make_pair(y1, x1));check[y1][x1] = true;int ret = 0;while(!q.empty()){queue<pair<int, int> > q1;while(!q.empty()){int y = q.front().first;int x = q.front().second;q.pop();if(y == y2 && x == x2)return ret;for(int i=0; i<4; ++i){int y0 = y + dy[i];int x0 = x + dx[i];if(0 <= y0 && y0 < h && 0 <= x0 && x0 < w && plane[y0][x0] != wall && !check[y0][x0]){q1.push(make_pair(y0, x0));check[y0][x0] = true;}}}++ ret;q = q1;}return -1;}int main(){int w, h, n;cin >> w >> h >> n;vector<string> s(2*h+1, string(2*w+1, '#'));for(int y=0; y<h; ++y){for(int x=0; x<w; ++x){s[2*y+1][2*x+1] = '.';}}vector<vector<int> > a(2*h+1, vector<int>(2*w+1, 0));vector<vector<int> > b(2*h+1, vector<int>(2*w+1, 0));for(int i=0; i<n; ++i){int m;cin >> m;vector<int> y(m+1), x(m+1);for(int j=0; j<m+1; ++j){int b;cin >> b;y[j] = b / w;x[j] = b % w;}for(int j=1; j<m+1; ++j){int y1 = 2 * y[j-1] + 1;int x1 = 2 * x[j-1] + 1;int y2 = 2 * y[j] + 1;int x2 = 2 * x[j] + 1;if(y1 == y2){if(x2 < x1)swap(x1, x2);++ a[y1][x1];-- a[y1][x2];}else{if(y2 < y1)swap(y1, y2);++ b[y1][x1];-- b[y2][x1];}}}for(int y=0; y<2*h+1; ++y){int sum = 0;for(int x=0; x<2*w+1; ++x){sum += a[y][x];if(sum > 0)s[y][x] = '.';}}for(int x=0; x<2*w+1; ++x){int sum = 0;for(int y=0; y<2*h+1; ++y){sum += b[y][x];if(sum > 0)s[y][x] = '.';}}int ans = minDist(s, '#', 1, 1, 2 * h - 1, 2 * w - 1);if(ans == -1)cout << "Odekakedekinai.." << endl;elsecout << (ans / 2) << endl;return 0;}