結果
| 問題 | 
                            No.340 雪の足跡
                             | 
                    
| コンテスト | |
| ユーザー | 
                             srup٩(๑`н´๑)۶
                         | 
                    
| 提出日時 | 2016-08-09 13:43:35 | 
| 言語 | C++11(廃止可能性あり)  (gcc 13.3.0)  | 
                    
| 結果 | 
                             
                                RE
                                 
                             
                            
                         | 
                    
| 実行時間 | - | 
| コード長 | 1,702 bytes | 
| コンパイル時間 | 836 ms | 
| コンパイル使用メモリ | 69,936 KB | 
| 実行使用メモリ | 12,584 KB | 
| 最終ジャッジ日時 | 2024-11-07 08:12:06 | 
| 合計ジャッジ時間 | 20,552 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge5 / judge4 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 1 WA * 1 RE * 3 | 
| other | AC * 20 WA * 1 RE * 4 TLE * 7 | 
ソースコード
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <queue>
using namespace std;
#define rep(i,n) for(int i=0;i<(n);i++)
int dx[4] = {1, 0, 0, -1};
int dy[4] = {0, 1, -1, 0};
vector<int> b[1001];
bool board[1001][1001];
int memo[1001][1001];
int main(void){
	int w, h, n; cin >> w >> h >> n;
	rep(i, n){
		int m; cin >> m;
		rep(j, m + 1){
			int tmp; cin >> tmp;
			b[i].push_back(tmp);
		}
	}
	//通れる道を探す
	for (int i = 0; i < n; ++i){
		for (int j = 0; j < b[i].size() - 1; ++j){
			if((b[i][j + 1] - b[i][j]) % w == 0){
				// 縦方向の動く
				for (int k = b[i][j]; k <= b[i][j + 1]; k += w){
					// printf("tate %d %d\n", k / w, k % w);
					board[k / w][k % w] = true;
				}
			}else{
				// 横方向に動く
				for (int k = b[i][j]; k <= b[i][j + 1]; ++k){
					// printf("yoko %d %d\n", k / w, k % w);
					board[k / w][k % w] = true;
				}
			}
		}
	}
	/*
	rep(i, h){
		rep(j, w){
			if(board[i][j])printf("o");
			else printf("x");
		}
		printf("\n");
	}
	*/
	rep(i, 1001)rep(j, 1001)memo[i][j] = -1;//初期化
	memo[0][0] = 0;
	queue<pair<int, int> > q;
	q.push(make_pair(0, 0));
	int cnt = 0;
	while(!q.empty() || cnt < 100000){
		cnt++;
		auto now = q.front(); q.pop();
		for (int i = 0; i < 4; ++i){
			int nowy = now.first + dy[i], nowx = now.second + dx[i];
			if(0 <= nowy && nowy < h && 0 <= nowx && nowx < w){
				if(memo[nowy][nowx] == -1 && board[nowy][nowx]){
					memo[nowy][nowx] = memo[now.first][now.second] + 1;
					q.push(make_pair(nowy, nowx));
					if(nowy == h - 1 && nowx == w - 1){
						printf("%d\n", memo[nowy][nowx]);
						return 0;
					}
				}
			}
		}
	}
	printf("Odekakedekinai..\n");
	return 0;
}
            
            
            
        
            
srup٩(๑`н´๑)۶