제출 #199443

#제출 시각아이디문제언어결과실행 시간메모리
199443TadijaSebez포탈들 (BOI14_portals)C++11
100 / 100
387 ms29164 KiB
#include <bits/stdc++.h>
using namespace std;
const int N=1050;
char base[N][N];
int wd[N][N],U[N][N],D[N][N],L[N][N],R[N][N];
int mv[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int dist[N][N];
int main(){
	int n,m,sx,sy,ex,ey;
	scanf("%i %i",&n,&m);
	for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)wd[i][j]=min({i,j,n-i+1,m-j+1});
	queue<int> q;
	for(int i=1;i<=n;i++){
		scanf("%s",base[i]+1);
		for(int j=1;j<=m;j++){
			if(base[i][j]=='S'){
				sx=i,sy=j;
				base[i][j]='.';
			}else if(base[i][j]=='C'){
				ex=i,ey=j;
				base[i][j]='.';
			}else if(base[i][j]=='#'){
				wd[i][j]=0;
				q.push(i*N+j);
			}
		}
	}
	while(q.size()){
		int x=q.front()/N;
		int y=q.front()%N;
		q.pop();
		for(int k=0;k<4;k++){
			int i=x+mv[k][0];
			int j=y+mv[k][1];
			if(base[i][j]=='.'){
				if(wd[i][j]>wd[x][y]+1){
					wd[i][j]=wd[x][y]+1;
					q.push(i*N+j);
				}
			}
		}
	}
	for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)U[i][j]=base[i-1][j]=='.'?U[i-1][j]:i*N+j,L[i][j]=base[i][j-1]=='.'?L[i][j-1]:i*N+j;
	for(int i=n;i>=1;i--)for(int j=m;j>=1;j--)D[i][j]=base[i+1][j]=='.'?D[i+1][j]:i*N+j,R[i][j]=base[i][j+1]=='.'?R[i][j+1]:i*N+j;
	for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)dist[i][j]=1e9;
	dist[sx][sy]=0;
	priority_queue<pair<int,int>> pq;
	pq.push({-dist[sx][sy],sx*N+sy});
	auto Try=[&](int x,int y,int d){
		if(dist[x][y]>d){
			dist[x][y]=d;
			pq.push({-dist[x][y],x*N+y});
		}
	};
	while(pq.size()){
		int x=pq.top().second/N;
		int y=pq.top().second%N;
		int d=-pq.top().first;
		pq.pop();
		if(d!=dist[x][y])continue;
		for(int k=0;k<4;k++){
			int i=x+mv[k][0];
			int j=y+mv[k][1];
			if(base[i][j]=='.'){
				Try(i,j,dist[x][y]+1);
			}
		}
		Try(U[x][y]/N,U[x][y]%N,dist[x][y]+wd[x][y]);
		Try(D[x][y]/N,D[x][y]%N,dist[x][y]+wd[x][y]);
		Try(L[x][y]/N,L[x][y]%N,dist[x][y]+wd[x][y]);
		Try(R[x][y]/N,R[x][y]%N,dist[x][y]+wd[x][y]);
	}
	printf("%i\n",dist[ex][ey]);
	return 0;
}

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

portals.cpp: In function 'int main()':
portals.cpp:10:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%i %i",&n,&m);
  ~~~~~^~~~~~~~~~~~~~~
portals.cpp:14:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%s",base[i]+1);
   ~~~~~^~~~~~~~~~~~~~~~
portals.cpp:73:8: warning: 'ey' may be used uninitialized in this function [-Wmaybe-uninitialized]
  printf("%i\n",dist[ex][ey]);
  ~~~~~~^~~~~~~~~~~~~~~~~~~~~
portals.cpp:73:8: warning: 'ex' may be used uninitialized in this function [-Wmaybe-uninitialized]
portals.cpp:48:29: warning: 'sy' may be used uninitialized in this function [-Wmaybe-uninitialized]
  pq.push({-dist[sx][sy],sx*N+sy});
                         ~~~~^~~
portals.cpp:48:27: warning: 'sx' may be used uninitialized in this function [-Wmaybe-uninitialized]
  pq.push({-dist[sx][sy],sx*N+sy});
                         ~~^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...