Cod sursa(job #130928)

Utilizator swift90Ionut Bogdanescu swift90 Data 2 februarie 2008 16:43:28
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.16 kb
#include<stdio.h>
const int dx[]={-1,0,1,0};
const int dy[]={0,1,0,-1};
struct cod{
	int x,y;
};
cod coada[3000000];
int dist[1005][1005],cost[1005][1005];
int nr[1005][1005],x1,x2,y1,y2,p,u;
char aux[1005];
void citire(int r,int c){
	int i,j;
	fgets(aux,10,stdin);
	for(i=0;i<=r+1;++i)
		nr[i][0]=nr[i][c+1]=1;
	for(i=0;i<=c+1;++i)
		nr[0][i]=nr[r+1][i]=1;
	for(i=1;i<=r;++i){
		fgets(aux,1010,stdin);
		for(j=1;j<=c;++j){
			if(aux[j-1]=='*')
				nr[i][j]=1;
			if(aux[j-1]=='D'){
				nr[i][j]=10;
				coada[u].x=i;
				coada[u].y=j;
				++u;
			}
			if(aux[j-1]=='I'){
				x1=i;
				y1=j;
			}
			if(aux[j-1]=='O'){
				x2=i;
				y2=j;
			}
		}
	}
}
/*void scrie(int r,int c){
	int i,j;
	for(i=0;i<=r+1;++i){
		for(j=0;j<=c+1;++j)
			printf("%3d,%d",pred[i][j].x,pred[i][j].y);
		printf("\n");
	}
}*/
void lee1(int r,int c){
	int i,x,y;
	while(p!=u){
		for(i=0;i<4;++i){
			x=coada[p].x;
			y=coada[p].y;
			if(nr[x+dx[i]][y+dy[i]]==0){
				if(dist[x+dx[i]][y+dy[i]]==0){
					dist[x+dx[i]][y+dy[i]]=dist[x][y]+1;
					coada[u].x=x+dx[i];
					coada[u].y=y+dy[i];
					nr[x+dx[i]][y+dy[i]]=15;
					++u;
				}
			}
		}
		++p;
	}
}
inline int min(int a,int b){
	return a<b?a:b;
}
void lee2(int r,int c){
	int i,x,y;
	p=0;
	u=1;
	coada[0].x=x1;
	coada[0].y=y1;
	cost[x1][y1]=dist[x1][y1];
	while(p!=u){
		x=coada[p].x;
		y=coada[p].y;
		for(i=0;i<4;++i){
			if(nr[x+dx[i]][y+dy[i]]==15){
				if(cost[x+dx[i]][y+dy[i]]==0){
					cost[x+dx[i]][y+dy[i]]=min(cost[x][y],dist[x+dx[i]][y+dy[i]]);
					coada[u].x=x+dx[i];
					coada[u].y=y+dy[i];
					++u;
				}
				else{
					if(min(dist[x+dx[i]][y+dy[i]],cost[x][y])>cost[x+dx[i]][y+dy[i]]){
						cost[x+dx[i]][y+dy[i]]=min(cost[x][y],dist[x+dx[i]][y+dy[i]]);
						coada[u].x=x+dx[i];
						coada[u].y=y+dy[i];
						++u;
					}
				}
			}
		}
		++p;
	}
}
int main(){
	freopen("barbar.in","r",stdin);
	freopen("barbar.out","w",stdout);
	int r,c;
	scanf("%d%d",&r,&c);
	citire(r,c);
	lee1(r,c);
	lee2(r,c);
//	scrie(r,c);
	if(cost[x2][y2]==0)
		printf("-1\n");
	else
		printf("%d\n",cost[x2][y2]);
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}