結果
| 問題 |
No.340 雪の足跡
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2019-12-15 19:07:18 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,093 bytes |
| コンパイル時間 | 726 ms |
| コンパイル使用メモリ | 76,008 KB |
| 実行使用メモリ | 15,296 KB |
| 最終ジャッジ日時 | 2024-07-02 18:18:07 |
| 合計ジャッジ時間 | 7,387 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 5 |
| other | AC * 27 WA * 5 |
ソースコード
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int di[8] = {0,0,1,-1,1,1,-1,-1};
int dj[8] = {1,-1,0,0,1,-1,1,-1};
#define inRange(x,a,b) (a <= x && x < b)
int yoko[1001][1001] = {}, tate[1001][1001] = {};
void no(){
cout << "Odekakedekinai.." << endl;
exit(0);
}
int main(){
int w, h, n;
cin >> w >> h >> n;
while(n--){
int m; cin >> m;
int x; cin >> x;
while(m--){
int y; cin >> y;
int i = x/w, j = x%w, ni = y/w, nj = y%w;
if(i == ni){
if(j > nj) swap(j, nj);
yoko[i][j]++;
yoko[i][nj+1]--;
}else if(j == nj){
if(i > ni) swap(i, ni);
tate[i][j]++;
tate[ni+1][j]--;
}
x = y;
}
}
for(int i = 0; i < h; i++){
for(int j = 1; j < w; j++){
yoko[i][j] += yoko[i][j-1];
}
}
for(int j = 0; j < w; j++){
for(int i = 1; i < h; i++){
tate[i][j] += tate[i-1][j];
}
}
if(tate[0][0]==0&&yoko[0][0]==0){
no();
}
int dp[h][w];
memset(dp, 0x3f, sizeof(dp));
dp[0][0] = 0;
queue<int> q;
q.push(0);
while(!q.empty()){
int x = q.front(); q.pop();
int i = x/w, j = x%w;
if(i != 0 && dp[i-1][j] > dp[i][j]+1 && tate[i][j]>0 && tate[i-1][j]>0){
dp[i-1][j] = dp[i][j]+1;
q.push((i-1)*w+j);
}
if(i != h-1 && dp[i+1][j] > dp[i][j]+1 && tate[i][j]>0 && tate[i+1][j]>0){
dp[i+1][j] = dp[i][j]+1;
q.push((i+1)*w+j);
}
if(j != 0 && dp[i][j-1] > dp[i][j]+1 && yoko[i][j]>0 && yoko[i][j-1]>0){
dp[i][j-1] = dp[i][j]+1;
q.push(i*w+(j-1));
}
if(j != w-1 && dp[i][j+1] > dp[i][j]+1 && yoko[i][j]>0 && yoko[i][j+1]>0){
dp[i][j+1] = dp[i][j]+1;
q.push(i*w+(j+1));
}
}
if(dp[h-1][w-1]==1<<30) no();
else cout << dp[h-1][w-1] << endl;
return 0;
}