結果
問題 | No.3121 Prime Dance |
ユーザー |
![]() |
提出日時 | 2025-04-18 22:46:19 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 419 ms / 2,000 ms |
コード長 | 2,096 bytes |
コンパイル時間 | 4,724 ms |
コンパイル使用メモリ | 263,572 KB |
実行使用メモリ | 84,480 KB |
最終ジャッジ日時 | 2025-04-18 22:46:29 |
合計ジャッジ時間 | 8,659 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 21 |
ソースコード
#include <stdio.h> #include <atcoder/all> #include <bits/stdc++.h> using namespace std; using namespace atcoder; using mint = modint998244353; #define rep(i,n) for (int i = 0; i < (n); ++i) #define Inf32 1000000001 #define Inf64 4000000000000000001LL bool is_p(int n){ if(n<=1)return false; for(int i=2;i<n;i++){ if(n%i==0)return false; } return true; } int main(){ vector<vector<int>> dis(45); rep(i,900){ rep(j,45){ if(is_p(i)&&is_p(i+j)){ dis[j].push_back(i); } } } int h,w; cin>>h>>w; int sx,sy,gx,gy; cin>>sx>>sy>>gx>>gy; sx--,sy--,gx--,gy--; vector<string> s(h); rep(i,h)cin>>s[i]; s[sx][sy] = '.'; s[gx][gy] = '.'; vector d(h,vector(w,vector(900,vector<int>(2,Inf32)))); d[sx][sy][0][0] = 0; deque<vector<int>> Q; Q.push_back({sx,sy,0,0}); while(Q.size()>0){ vector<int> dx = {1,-1,0,0},dy = {0,0,1,-1}; int x = Q.front()[0],y = Q.front()[1],t = Q.front()[2],k = Q.front()[3]; Q.pop_front(); rep(i,4){ int nx = x+dx[i],ny = y+dy[i]; if(nx<0||nx>=h||ny<0||ny>=w)continue; if(s[nx][ny] == '#')continue; int nt = t,nk = k; if(i==0)nt++; if(i>=2)nk = 1; if(nt >= 900)continue; int nd = d[x][y][t][k]; if(i==2)nd++; if(nd>=d[nx][ny][nt][nk])continue; else{ d[nx][ny][nt][nk] = nd; if(i!=2)Q.push_front({nx,ny,nt,nk}); else Q.push_back({nx,ny,nt,nk}); } } } int ans = Inf32; rep(i,900){ if(sx==gx && i==0)continue; int cur = 0; { int dd = gx - sx; int ii = i; if(dd >= 0)ii -= dd; dd = abs(dd); int tt = distance(dis[dd].begin(),lower_bound(dis[dd].begin(),dis[dd].end(),ii)); if(tt == dis[dd].size())continue; cur += dis[dd][tt] * 2 + dd; } { int dd = gy - sy; int ii = d[gx][gy][i][1]; if(sy!=gy)ii = min(ii, d[gx][gy][i][0]); if(ii==Inf32)continue; if(dd >= 0)ii -= dd; dd = abs(dd); int tt = distance(dis[dd].begin(),lower_bound(dis[dd].begin(),dis[dd].end(),ii)); if(tt == dis[dd].size())continue; cur += dis[dd][tt] * 2 + dd; } ans = min(ans,cur); } if(ans == Inf32)cout<<-1<<endl; else cout<<ans<<endl; return 0; }