Cod sursa(job #2308444)

Utilizator _Victor_Victor Ciobanu _Victor_ Data 27 decembrie 2018 09:40:55
Problema Sate Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.98 kb
#include <bits/stdc++.h>

using namespace std;

int A[1010][1010],ro[2][1010][1010],n,DP[2][1010],O[6][2];
int X[]={0,-1,0,1},Y[]={-1,0,1,0};
ifstream fin("ai.in");
ofstream fout("ai.out");

bool ad(int x,int y,int vy,int vx){
	return (x!=1 || vx<n) && (y!=1 || vy<n) && (y!=-1 || vy>1) && (x!=-1 || vx>1);
}

int Lee(int r, int s){
	queue <pair<int,int> > q;
	pair <int,int> p;
	r+=2;
	s+=1;
	p.first=O[r][0];
	p.second=O[r][1];
	while(!q.empty())q.pop();
	q.push(p);
	if(r==3)
	while(!q.empty()){
		if((q.front().first==O[s][0] && q.front().second==O[s][1])||(((q.front().first>O[0][0] && q.front().second>O[0][1] && q.front().first<=O[s][0] && q.front().second<=O[s][1]) || 
		(q.front().first<O[0][0] && q.front().second<O[0][1] && q.front().first>=O[s][0] && q.front().second>=O[s][1])) && abs(q.front().first-O[s][0])==abs(q.front().second-O[s][1]) && abs(q.front().first-O[0][0])==abs(q.front().second-O[0][1]) && abs(O[0][0]-O[s][0])==abs(O[0][1]-O[s][1]))){
			int x=q.front().second,y=q.front().first,ind=ro[r%2][q.front().first][q.front().second];
			while(ind){
				ro[r%2][y][x]=-ind;
				if(y>1 && ro[r%2][y-1][x]==ind-1){ 
					y--;
				}else if(x>1 && ro[r%2][y][x-1]==ind-1){ 
						x--;
					} else if(y<n && ro[r%2][y+1][x]==ind-1){
							y++;
						}else if(x<n && ro[r%2][y][x+1]==ind-1){
							x++;
						} 
				ind--;
			}
			return -ro[r%2][q.front().first][q.front().second];
		}
		for(int i=0;i<4;i++){
			if(ad(X[i],Y[i],q.front().first,q.front().second))
			if(!ro[r%2][q.front().first+Y[i]][q.front().second+X[i]] && (!A[q.front().first+Y[i]][q.front().second+X[i]] || A[q.front().first+Y[i]][q.front().second+X[i]]<=-3)){
				q.push({q.front().first+Y[i],q.front().second+X[i]});
				ro[r%2][q.front().first+Y[i]][q.front().second+X[i]]=ro[r%2][q.front().first][q.front().second]+1;
			}
		}
		q.pop();
	}else while(!q.empty()){
		if((q.front().first==O[s][0] && q.front().second==O[s][1]) || (((q.front().first>O[0][0] && q.front().second>O[0][1] && q.front().first<=O[s][0] && q.front().second<=O[s][1]) || (q.front().first<O[0][0] && q.front().second<O[0][1] && q.front().first>=O[s][0] && q.front().second>=O[s][1])) 
		&& abs(q.front().first-O[s][0])==abs(q.front().second-O[s][1]) && abs(q.front().first-O[0][0])==abs(q.front().second-O[0][1]) && abs(O[0][0]-O[s][0])==abs(O[0][1]-O[s][1]))){
			return ro[r%2][q.front().first][q.front().second];
		}
		for(int i=0;i<4;i++){
			if(ad(X[i],Y[i],q.front().first,q.front().second) && ro[r%2][q.front().first][q.front().second]+1!=-ro[(r+1)%2][q.front().first+Y[i]][q.front().second+X[i]])
			if(!ro[r%2][q.front().first+Y[i]][q.front().second+X[i]] && (!A[q.front().first+Y[i]][q.front().second+X[i]] || A[q.front().first+Y[i]][q.front().second+X[i]]<=-3)){
				q.push({q.front().first+Y[i],q.front().second+X[i]});
				ro[r%2][q.front().first+Y[i]][q.front().second+X[i]]=ro[r%2][q.front().first][q.front().second]+1;
			}
		}
		q.pop();
	}
	return -1;
}

int main(){
	memset(A,0,sizeof A);
	memset(DP,0,sizeof DP);
	fin>>n;
	int y,x;
	fin>>y>>x;
	A[y][x]=-2;//tinta
	O[0][0]=y;
	O[0][1]=x;
	fin>>y>>x;
	A[y][x]=-3;//Sursa 1
	O[1][0]=y;
	O[1][1]=x;
	fin>>y>>x;
	A[y][x]=-3;//Sursa 2
	O[2][0]=y;
	O[2][1]=x;
	fin>>y>>x;
	A[y][x]=-4;//Robotul 1
	O[3][0]=y;
	O[3][1]=x;
	fin>>y>>x;
	A[y][x]=-4;//Robotul 2
	O[4][0]=y;
	O[4][1]=x;
	int k;
	fin>>k;
	for(int i=0;i<k;i++){
		fin>>y>>x;
		A[y][x]=-1;//Obstacole
	}
	int l=0,lc;
	for(int i=1;i<=n;i++){
		lc=0;
		memset(DP[i%2],0,sizeof DP[i%2]);
		for(int j=1;j<=n;j++){
			if(A[i][j]==-1){
				lc++;
				DP[i%2][j]=DP[(i+1)%2][j]+1;
			}else{
				l=max(lc,l);
				lc=0;
			}
			l=max(DP[i%2][j],l);
		}
		l=max(lc,l);
	}
	fout<<l<<'\n';
	memset(ro,0,sizeof ro);
	int s=0,s1,s2;
	s1=Lee(1,0);
	s2=Lee(2,1);
	if(s1==-1 || s2==-1) s=-1;
	else s=max(s1,s2);
	memset(ro,0,sizeof ro);
	s1=Lee(1,1);
	s2=Lee(2,0);
	int sc;
	if(s1==-1 || s2==-1)sc=-1;
	else sc=max(s1,s2);
	if(s>sc && sc!=-1) s=sc;
	fout<<s;
	return 0;
}