Cod sursa(job #712196)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 13 martie 2012 09:47:50
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <fstream>
#include <queue>
#include <bitset>
#include <cstdio>
#include <cstring>
#define NMAx 1024
#define ff first
#define ss second
#define mkp make_pair
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;

queue < pair<short,short> > Q;
pair <short,short> Start,Finish;
short N,M,Sol,A[NMAx][NMAx],Dx[]={1,-1,0,0},Dy[]={0,0,1,-1};
bitset <NMAx> viz[NMAx];
char S[NMAx];

bool Fill(int Val) {
	
	int k,X,Y,Xnou,Ynou;
	
	memset(viz,0,sizeof(viz));
	
	while(Q.size()) {
		
		X=Q.front().ff;
		Y=Q.front().ss;
		Q.pop();
		
		for(k=0;k<4;k++) {
			
			Xnou=X+Dx[k];
			Ynou=Y+Dy[k];
			
			if(!viz[Xnou][Ynou]&&A[Xnou][Ynou]>=Val) {
				viz[Xnou][Ynou]=1;
				Q.push(mkp(Xnou,Ynou));
				}
			
			}
		
		}
	
	if(viz[Finish.ff][Finish.ss])
		return 1;
	return 0;
	
}
int Search() {
	
	int Right,Step,i;
	
	Right=min(A[Start.ff][Start.ss],A[Finish.ff][Finish.ss]);
	
	for(Step=1;Step<Right;Step<<=1);
	
	for(i=0;Step;Step>>=1)
		if(Step+i<=Right&&Fill(i+Step))
			i+=Step;
	
	return i+Step;
	
}
void Lee() {
	
	int k,X,Y,Xnou,Ynou;
	
	while(Q.size()) {
		
		X=Q.front().ff;
		Y=Q.front().ss;
		Q.pop();
		
		for(k=0;k<4;k++) {
			
			Xnou=X+Dx[k];
			Ynou=Y+Dy[k];
			
			if(!A[Xnou][Ynou]) {
				A[Xnou][Ynou]=A[X][Y]+1;
				Q.push(mkp(Xnou,Ynou));
				}
			
			if(A[Xnou][Ynou]>A[X][Y]+1)
				A[Xnou][Ynou]=A[X][Y]+1;
			
			}
		}
	
}
void bordare() {
	
	for(int i=0;i<=M+1;i++)
		A[0][i]=A[N+1][i]=-1;
	
	for(int i=0;i<=N+1;i++)
		A[i][0]=A[i][M+1]=-1;
	
}
void citire() {
	
	int i,j;
	ifstream in("barbar.in");
	in>>N>>M;
	
	for(i=1;i<=N;i++) {
		
		in.getline(S+1,NMAx);
		
		for(j=1;j<=M;j++)
			switch(S[j]) {
				case '.':break;
				case '*':A[i][j]=-1;break;
				case 'D':Q.push(mkp(i,j));break;
				case 'I':Start=mkp(i,j);break;
				case 'O':Finish=mkp(i,j);break;
				}
			
		}
	
	in.close();
	
}
void afis() {
	
	ofstream out("barbar.out");
	
	out<<Sol<<'\n';
	
	out.close();
	
}
int main() {
	
	//citire();
	//bordare();
	
	//Lee();
	//Sol=Search();
	
	//afis();
	
	return 0;
	
}