View Code of Problem 3603

#include <stdio.h>
#include <string.h>

#define MAXN 105

int r,c,n,T;

int explode_time[MAXN];
int drop_size[MAXN];

int drop_id[MAXN][MAXN];

struct Pos {
	int x,y;
};

inline bool in_grid(const Pos &a)
{
	return a.x>=1 && a.x<=r && a.y>=1 && a.y<=c;
}

Pos U[MAXN],D[MAXN],L[MAXN],R[MAXN];
bool fU[MAXN],fD[MAXN],fL[MAXN],fR[MAXN];

Pos drop_pos[MAXN];

inline void move(Pos &p,bool &f,int dx,int dy)
{
	if (f) return;
	p.x+=dx;p.y+=dy;
	if (!in_grid(p)) {
		f=1;
		return;
	}
	int id=drop_id[p.x][p.y];
	if (id) {
		if (drop_size[id]<=4) ++drop_size[id];
		f=1;
	}
}

inline void solve()
{
	memset(explode_time,0,sizeof(explode_time));
	memset(drop_size,0,sizeof(drop_size));
	memset(drop_id,0,sizeof(drop_id));
	
	int i,j;
	
	for (i=1;i<=n;i++) {
		int x,y,size;
		scanf("%d%d%d",&x,&y,&size);
		drop_size[i]=size;
		drop_id[x][y]=i;
		drop_pos[i]=(Pos){x,y};
	}
	
	int x0,y0;
	scanf("%d%d",&x0,&y0);
	
	int cnt=1;
	fU[0]=fD[0]=fL[0]=fR[0]=0;
	U[0]=D[0]=L[0]=R[0]=(Pos){x0,y0};
	
	for (i=1;i<=T;i++) {
		for (j=0;j<cnt;j++) {
			move(U[j],fU[j],-1,0);
			move(D[j],fD[j],1,0);
			move(L[j],fL[j],0,-1);
			move(R[j],fR[j],0,1);
		}
		
		for (j=1;j<=n;j++) {
			if (drop_size[j]==5) {
				explode_time[j]=i;
				drop_id[drop_pos[j].x][drop_pos[j].y]=0;
				fU[cnt]=fD[cnt]=fL[cnt]=fR[cnt]=0;
				U[cnt]=D[cnt]=L[cnt]=R[cnt]=drop_pos[j];
				++cnt;
				drop_size[j]=0;
			}
		}
	}
	
	for (i=1;i<=n;i++) {
		if (explode_time[i]) {
			printf("0 %d\n",explode_time[i]);
		} else {
			printf("1 %d\n",drop_size[i]);
		}
	}
}

int main()
{
	while (scanf("%d%d%d%d",&r,&c,&n,&T)==4) {
		solve();
	}
}

Double click to view unformatted code.


Back to problem 3603