제출 #1223392

#제출 시각아이디문제언어결과실행 시간메모리
1223392_rain_Patkice II (COCI21_patkice2)C++20
110 / 110
687 ms93272 KiB
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int MAX_NUM=2000; const int dx[]={0,0,-1,1}; const int dy[]={-1,1,0,0}; char c[MAX_NUM+2][MAX_NUM+2]; int t[MAX_NUM+2][MAX_NUM+2],d[MAX_NUM+2][MAX_NUM+2]; int numrow,numcol; int type(char c){ if (c=='<') return 0; if (c=='>') return 1; if (c=='^') return 2; if (c=='v') return 3; return -1; } struct Node{ int x,y; int cost; bool operator < (const Node&other) const{ return cost>other.cost; } }; struct Store{ int t,x,y; }; Store trace[MAX_NUM+2][MAX_NUM+2]; bool possible(int u,int v){ if (u<=0||u>numrow||v<=0||v>numcol) return false; if (c[u][v]=='o') return false; return true; } char change(int t){ if (t==0) return '<'; if (t==1) return '>'; if (t==2) return '^'; if (t==3) return 'v'; return '.'; } int main(){ ios::sync_with_stdio(false); cin.tie(0) ; cout.tie(0); #define task "main" if (fopen(task".inp","r")){ freopen(task".inp","r",stdin); freopen(task".out","w",stdout); } cin>>numrow>>numcol; pair<int,int>start={-1,-1}; pair<int,int>end_point={-1,-1}; for(int i=1;i<=numrow;++i){ for(int j=1;j<=numcol;++j){ cin>>c[i][j]; t[i][j]=type(c[i][j]); if (c[i][j]=='o') { start={i,j}; } else if (c[i][j]=='x') { end_point={i,j}; } } } priority_queue<Node>q; assert(start.first!=-1 && start.second!=-1); memset(d,0x3f,sizeof d); for(int i=0;i<4;++i){ int nxt_u=start.first+dx[i],nxt_v=start.second+dy[i]; if (possible(nxt_u,nxt_v)==false) continue; d[nxt_u][nxt_v]=0; q.push({nxt_u,nxt_v,d[nxt_u][nxt_v]}); } while (q.size()){ int u=q.top().x,v=q.top().y; int cost=q.top().cost; q.pop(); if (cost!=d[u][v]) continue; if (c[u][v]=='x') break; for(int i=0;i<4;++i){ int nxt_u=u+dx[i],nxt_v=v+dy[i]; if (possible(nxt_u,nxt_v)==false) continue; int change_cost=1; if (t[u][v]==i) change_cost=0; if (d[nxt_u][nxt_v]>cost+change_cost){ d[nxt_u][nxt_v]=cost+change_cost; trace[nxt_u][nxt_v]={i,u,v}; q.push({nxt_u,nxt_v,d[nxt_u][nxt_v]}); } } } int u=end_point.first,v=end_point.second; while (true){ Store x=trace[u][v]; if (x.x==0&&x.y==0) break; c[x.x][x.y]=change(x.t); u=x.x,v=x.y; } cout<<d[end_point.first][end_point.second]<<'\n'; for(int i=1;i<=numrow;++i){ for(int j=1;j<=numcol;++j) cout<<c[i][j]; cout<<'\n'; } return 0; }

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

Main.cpp: In function 'int main()':
Main.cpp:51:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   51 |                 freopen(task".inp","r",stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
Main.cpp:52:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   52 |                 freopen(task".out","w",stdout);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...