제출 #72875

#제출 시각아이디문제언어결과실행 시간메모리
72875ainta수중 미로 (FXCUP3_aqua)C++17
100 / 100
1255 ms265072 KiB
#include<cstdio> #include<algorithm> #include<vector> #include<queue> #define pli pair<long long,int> using namespace std; int n, Num[910][910], NX[910][910], NY[910][910], BX[910], EX[910], BY[910], EY[910]; int L[3010000]; long long D[3010000]; char p[910][910]; priority_queue<pli>PQ; vector<int>E[3010000], LL[3010000]; void Add_Edge(int a, int b, int d) { E[a].push_back(b); LL[a].push_back(d*d); } void Put(int a, long long d) { if (D[a] <= d)return; D[a] = d; PQ.push({ -d,a }); } int main() { //freopen("input.txt", "r", stdin); int i, j, sx, sy, cnt = 0, ex, ey; scanf("%d", &n); for (i = 1; i <= n; i++) { scanf("%s", p[i]+1); for (j = 1; j <= n; j++){ if (p[i][j] == 'M') { sx = i, sy = j; p[i][j] = '.'; } if (p[i][j] == 'H') { ex = i, ey = j; p[i][j] = '.'; } if (p[i][j] == '.') { cnt++; Num[i][j] = cnt; } } } for (i = 1; i <= n; i++) { BX[i] = cnt + 1; int c = 0, cp = 0; for (j = 1; j <= n; j++) { if (p[i][j] == '.') { if (p[i][j - 1] != '.')cnt++; if (c) { cp = c; c = 0; L[cnt] = cp; } NX[i][j] = cnt; } if (p[i][j] == 'W') { c++; } } EX[i] = cnt; } for (i = 1; i <= n; i++) { BY[i] = cnt + 1; int c = 0, cp = 0; for (j = 1; j <= n; j++) { if (p[j][i] == '.') { if (p[j - 1][i] != '.')cnt++; if (c) { cp = c; c = 0; L[cnt] = cp; } NY[j][i] = cnt; } if (p[j][i] == 'W') { c++; } } EY[i] = cnt; } for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) { Add_Edge(NX[i][j], Num[i][j], 0); Add_Edge(NY[i][j], Num[i][j], 0); if (NX[i][j] != BX[i]) { Add_Edge(Num[i][j], NX[i][j] - 1, L[NX[i][j]]); } if (NX[i][j] != EX[i]) { Add_Edge(Num[i][j], NX[i][j] + 1, L[NX[i][j] + 1]); } if (NY[i][j] != BY[j]) { Add_Edge(Num[i][j], NY[i][j] - 1, L[NY[i][j]]); } if (NY[i][j] != EY[j]) { Add_Edge(Num[i][j], NY[i][j] + 1, L[NY[i][j] + 1]); } } } for (i = 1; i <= cnt; i++)D[i] = 1e18; Put(Num[sx][sy], 0); while (!PQ.empty()) { pli tp = PQ.top(); PQ.pop(); int x = tp.second; if (D[x] != -tp.first)continue; for (i = 0; i < E[x].size(); i++) { Put(E[x][i], D[x] + LL[x][i]); } } long long res = D[Num[ex][ey]]; if (res > 8e16)res = -1; printf("%lld\n", res); }

컴파일 시 표준 에러 (stderr) 메시지

aqua.cpp: In function 'int main()':
aqua.cpp:106:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (i = 0; i < E[x].size(); i++) {
               ~~^~~~~~~~~~~~~
aqua.cpp:25:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &n);
  ~~~~~^~~~~~~~~~
aqua.cpp:27:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%s", p[i]+1);
   ~~~~~^~~~~~~~~~~~~~
aqua.cpp:100:5: warning: 'sy' may be used uninitialized in this function [-Wmaybe-uninitialized]
  Put(Num[sx][sy], 0);
  ~~~^~~~~~~~~~~~~~~~
aqua.cpp:100:5: warning: 'sx' may be used uninitialized in this function [-Wmaybe-uninitialized]
aqua.cpp:110:30: warning: 'ey' may be used uninitialized in this function [-Wmaybe-uninitialized]
  long long res = D[Num[ex][ey]];
                    ~~~~~~~~~~^
aqua.cpp:110:30: warning: 'ex' may be used uninitialized in this function [-Wmaybe-uninitialized]
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...