結果

問題 No.340 雪の足跡
ユーザー IL_mstaIL_msta
提出日時 2017-05-23 01:25:09
言語 C++11
(gcc 11.4.0)
結果
AC  
実行時間 413 ms / 1,000 ms
コード長 2,998 bytes
コンパイル時間 1,183 ms
コンパイル使用メモリ 112,776 KB
実行使用メモリ 69,812 KB
最終ジャッジ日時 2024-09-19 10:36:25
合計ジャッジ時間 7,979 ms
ジャッジサーバーID
(参考情報)
judge3 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
6,816 KB
testcase_01 AC 2 ms
6,944 KB
testcase_02 AC 1 ms
6,944 KB
testcase_03 AC 2 ms
6,944 KB
testcase_04 AC 1 ms
6,944 KB
testcase_05 AC 1 ms
6,940 KB
testcase_06 AC 1 ms
6,940 KB
testcase_07 AC 1 ms
6,944 KB
testcase_08 AC 2 ms
6,944 KB
testcase_09 AC 2 ms
6,944 KB
testcase_10 AC 2 ms
6,940 KB
testcase_11 AC 2 ms
6,940 KB
testcase_12 AC 2 ms
6,944 KB
testcase_13 AC 2 ms
6,940 KB
testcase_14 AC 20 ms
8,064 KB
testcase_15 AC 22 ms
8,320 KB
testcase_16 AC 12 ms
6,940 KB
testcase_17 AC 27 ms
9,088 KB
testcase_18 AC 24 ms
9,088 KB
testcase_19 AC 26 ms
9,088 KB
testcase_20 AC 148 ms
44,544 KB
testcase_21 AC 65 ms
6,940 KB
testcase_22 AC 22 ms
38,512 KB
testcase_23 AC 207 ms
69,812 KB
testcase_24 AC 109 ms
38,760 KB
testcase_25 AC 182 ms
52,152 KB
testcase_26 AC 20 ms
6,940 KB
testcase_27 AC 5 ms
6,944 KB
testcase_28 AC 23 ms
6,940 KB
testcase_29 AC 241 ms
41,824 KB
testcase_30 AC 176 ms
32,736 KB
testcase_31 AC 345 ms
64,120 KB
testcase_32 AC 413 ms
69,680 KB
testcase_33 AC 379 ms
69,668 KB
testcase_34 AC 400 ms
69,740 KB
testcase_35 AC 396 ms
69,676 KB
testcase_36 AC 392 ms
69,772 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#pragma region include
#include <iostream>
#include <iomanip>
#include <stdio.h>

#include <sstream>
#include <algorithm>
#include <cmath>
#include <complex>

#include <string>
#include <cstring>
#include <vector>
#include <tuple>

#include <queue>
#include <complex>
#include <set>
#include <map>
#include <stack>
#include <list>

#include <fstream>
#include <random>
//#include <time.h>
#include <ctime>
#pragma endregion //#include
/////////
#define REP(i, x, n) for(int i = x; i < n; ++i)
#define rep(i,n) REP(i,0,n)
/////////
#pragma region typedef
typedef long long LL;
typedef long double LD;
typedef unsigned long long ULL;
#pragma endregion //typedef
////定数
const int INF = (int)1e9;
const LL MOD = (LL)1e9+7;
const LL LINF = (LL)1e18;
const double PI = acos(-1.0);
const double EPS = 1e-9;
/////////
using namespace::std;

vector< vector<int> > Gra;
vector<int> dist;
void solve(){
	int W,H,N;
	cin >> W >> H >> N;
	Gra = vector< vector<int> >(W*H);
	vector< vector<int> > RR(W,vector<int>(H+1,0));
	vector< vector<int> > CC(H,vector<int>(W+1,0));
	for(int i=0;i<N;++i){//10^3
		int M;
		cin >> M;
		++M;
		vector<int> B(M);
		for(int j=0;j<M;++j){
			cin >> B[j];
		}
		for(int j=1;j<M;++j){//10^3
			int u,v;
			u = B[j-1];
			v = B[j];
			if( u > v ){
				swap(u,v);
			}
			if( u%W == v%W ){//縦移動RR
				int rank = u%W;
				RR[rank][u/W]++;
				RR[rank][(v/W)]--;
				/*for(int k=u+W;k<=v;k+=W){
					Gra[k-W].push_back(k);
					Gra[k].push_back(k-W);
				}*/
			}else{//横移動CC
				int rank = u/W;
				CC[rank][u%W]++;
				CC[rank][(v%W)]--;
				/*for(int k=u+1;k<=v;++k){
					Gra[k-1].push_back(k);
					Gra[k].push_back(k-1);
				}*/
			}
		}
	}
	for(int c=0;c<W;++c){
		if( RR[c][0] > 0 ){
			Gra[0*W+c].push_back(1*W+c);
			Gra[1*W+c].push_back(0*W+c);
		}
		for(int r=1;r<H-1;++r){
			RR[c][r]+= RR[c][r-1];
			if( RR[c][r] > 0 ){
				Gra[r*W+c].push_back((r+1)*W+c);
				Gra[(r+1)*W+c].push_back(r*W+c);
			}
		}
	}
	for(int r=0;r<H;++r){
		if( CC[r][0] > 0 ){
			Gra[r*W+0].push_back(r*W+1);
			Gra[r*W+1].push_back(r*W+0);
		}
		for(int c=1;c<W-1;++c){
			CC[r][c] += CC[r][c-1];
			if( CC[r][c] > 0 ){
				Gra[r*W+c].push_back(r*W+c+1);
				Gra[r*W+c+1].push_back(r*W+c);
			}
		}
	}
	dist = vector<int>(W*H,INF);
	vector<bool> visit(W*H, false);
	queue<int> que;
	que.push(0);//スタート地点
	visit[0] = true;
	dist[0] = 0;
	
	while(!que.empty()){
		int now = que.front();que.pop();
		int size = Gra[now].size();
		for(int i=0;i<size;++i){
			int to = Gra[now][i];
			if( visit[to] == true ) continue;
			visit[to] = true;
			dist[to] = dist[now] + 1;
			que.push( to );
		}
	}
	if( dist[W*H-1] == INF ){
		cout << "Odekakedekinai.." << endl;
	}else{
		cout << dist[W*H-1] << endl;
	}
}

#pragma region main
signed main(void){
	std::cin.tie(0);
	std::ios::sync_with_stdio(false);
	std::cout << std::fixed;//小数を10進数表示
	cout << setprecision(16);//小数点以下の桁数を指定//coutとcerrで別	
	
	solve();
}
#pragma endregion //main()
0