Submission #26211

#TimeUsernameProblemLanguageResultExecution timeMemory
26211samir_droubiPortals (BOI14_portals)C++14
70 / 100
1000 ms117328 KiB
#pragma optimize("O3")
#include <bits/stdc++.h>
using namespace std;
const int mxn=1005;
int n,m;
char g[mxn][mxn];
int id[mxn][mxn];
vector<pair<int,int> >adj[mxn*mxn];

int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
bool check(int x,int y){
	return x>=1&&x<=n&&y>=1&&y<=m&&g[x][y]!='#';
}

int wall[mxn*mxn];
queue<int>q;
void bfs()
{
	while(!q.empty())
	{
		int v=q.front();
		q.pop();
		for(int i=0;i<adj[v].size();++i)
		{
			int u=adj[v][i].first;
			if(wall[u]>wall[v]+1)
			{
				wall[u]=wall[v]+1;
				q.push(u);
			}
		}
	}
}


int dist[mxn*mxn];
priority_queue<pair<int,int >,vector<pair<int,int> > ,greater<pair<int,int> > >pq;
void dijkstra(int s)
{
	dist[s]=0;
	pq.push({0,s});
	while(!pq.empty())
	{
		pair<int,int > p=pq.top();
		pq.pop();
		int ds=p.first;
		int v=p.second;
		for(int i=0;i<adj[v].size();++i)
		{
			int u=adj[v][i].first;
			int w=adj[v][i].second;
			if(dist[u]>ds+w)
			{
				dist[u]=ds+w;
				pq.push({ds+w,u});
			}
		}		
	}
}

void clear()
{
	for(int i=0;i<mxn*mxn;++i)
	{
		wall[i]=(1e9);
		dist[i]=(1e9);
	}
}
void up(int i,int j)
{
	int x=i;
	while(x>=1&&g[x][j]!='#')
	{
		adj[id[x][j]].push_back({id[i][j],wall[id[x][j]]});
		--x;
	}
}
void down(int i,int j)
{
	int x=i;
	while(x<=n&&g[x][j]!='#')
	{
		adj[id[x][j]].push_back({id[i][j],wall[id[x][j]]});
		++x;
	}
}
void left(int i,int j)
{
	int y=j;
	while(y>=1&&g[i][y]!='#')
	{
		adj[id[i][y]].push_back({id[i][j],wall[id[i][y]]});
		--y;
	}
}
void right(int i,int j)
{
	int y=j;
	while(y<=m&&g[i][y]!='#')
	{
		adj[id[i][y]].push_back({id[i][j],wall[id[i][y]]});
		++y;
	}
}
int main()
{
	//int start_s=clock();
	clear();
	int st,en;

	scanf("%d%d",&n,&m);
	int cur=0;
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j)
			id[i][j]=++cur;

	for(int i=1;i<=n;++i)
	{
		scanf("%s",&g[i]);
		g[i][m+1]='\0';
		for(int j=m;j>=1;--j)
		{
			g[i][j]=g[i][j-1];
			if(g[i][j]=='S')
				st=id[i][j];
			if(g[i][j]=='C')
				en=id[i][j];
		}
	}
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j)
		{
			bool ok=false;
			for(int k=0;k<4;++k)
			{
				int x=i+dx[k];
				int y=j+dy[k];
				if(!check(x,y))ok=true;
				else adj[id[i][j]].push_back({id[x][y],1});
			}
			if(ok)
			{
				wall[id[i][j]]=1;
				q.push(id[i][j]);
			}
		}	

	bfs();

	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j)
		{
			if(g[i][j]!='#')continue;
			right(i,j+1);
			left(i,j-1);
			up(i-1,j);
			down(i+1,j);
		}
	for(int i=1;i<=n;++i)
	{
		right(i,1);
		left(i,n);
	}
	for(int j=1;j<=m;++j)
	{
		down(1,j);
		up(m,j);
	}

	dijkstra(st);
	printf("%d\n",dist[en]);
	//int stop_s=clock();
	//cout << "time: " << (stop_s-start_s)/double(CLOCKS_PER_SEC)*1000 << endl;
	return 0;
}

Compilation message (stderr)

portals.cpp:1:0: warning: ignoring #pragma optimize  [-Wunknown-pragmas]
 #pragma optimize("O3")
 ^
portals.cpp: In function 'void bfs()':
portals.cpp:24:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=0;i<adj[v].size();++i)
                ^
portals.cpp: In function 'void dijkstra(int)':
portals.cpp:49:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=0;i<adj[v].size();++i)
                ^
portals.cpp: In function 'int main()':
portals.cpp:120:19: warning: format '%s' expects argument of type 'char*', but argument 2 has type 'char (*)[1005]' [-Wformat=]
   scanf("%s",&g[i]);
                   ^
portals.cpp:112:21: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d",&n,&m);
                     ^
portals.cpp:120:20: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%s",&g[i]);
                    ^
portals.cpp:172:8: warning: 'en' may be used uninitialized in this function [-Wmaybe-uninitialized]
  printf("%d\n",dist[en]);
        ^
portals.cpp:171:14: warning: 'st' may be used uninitialized in this function [-Wmaybe-uninitialized]
  dijkstra(st);
              ^
#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...