HuGo

 avatar
duyvan
plain_text
a year ago
2.8 kB
13
Indexable
//HuGO
#include<stdio.h>
int map[20][20];
int N,M,SR,SC,K,L,E;
int mapKc[20][20];
int mapExit[20][20];
int dx[4]={-1,0,1,0};
int dy[4]={0,-1,0,1};
int mapTimeFire[20][20];
int visited[20][20];
int kq;
typedef struct{
	int x;
	int y;
}Point;
Point Q[500];
Point fire[500];
Point lake[500];
Point exit[500];
int t=0,r=0;
void push(int x, int y){
	Q[t].x=x;
	Q[t].y=y;
	t++;
}
void pop(int *x, int *y){
	*x=Q[r].x;
	*y=Q[r].y;
	r++;
}
void chay_lan(){
	int i,j;
	int count=0;
	r=0,t=0;
	for(i=1;i<=N;i++){
		for(j=1;j<=M;j++){
			if(map[i][j] == 1){
				push(i,j);
				mapTimeFire[i][j] = 1;
				count++;
			}
		}
	}
	//r=0,t=0;
	while(t!=r){
		Point cur;
		int k;
		pop(&cur.x,&cur.y);
		for(k=0;k<4;k++){
			int newX = cur.x + dx[k];
			int newY = cur.y + dy[k];
			if(newX<1 || newX>N || newY<1 || newY>M)continue;
			if(mapTimeFire[newX][newY] == 0 && map[newX][newY] ==0){
				mapTimeFire[newX][newY] = mapTimeFire[cur.x][cur.y] + 1;
				push(newX,newY);
			}
		}
	}
}
void hugo_chay(Point start, int time, int totalKc){
	if(mapExit[start.x][start.y]==1){
		if(kq<totalKc) kq=totalKc;
	}
	int k;
	for(k=0;k<4;k++){
		int newX = start.x + dx[k];
		int newY = start.y + dy[k];
		if(newX<1 || newX>N || newY<1 || newY>M)continue;
		if(visited[newX][newY]==0 && time+1<mapTimeFire[newX][newY]){
			visited[newX][newY]=1;
			Point p = {newX,newY};
			if(map[newX][newY]==2){
				hugo_chay(p,time+2,totalKc+mapKc[newX][newY]);
			}else{
				hugo_chay(p,time+1,totalKc+mapKc[newX][newY]);
			}
			visited[newX][newY]=0;
		}
	}
}
void reset(){
	int i,j;
	for(i=1;i<=N;i++){
		for(j=1;j<=M;j++){
			map[i][j]=0;
			mapKc[i][j]=0;
			mapExit[i][j]=0;
			mapTimeFire[i][j]=0;
			visited[i][j]=0;
		}
	}
}
int main(){
	freopen("input.txt","r",stdin);
	int tc,T;
	scanf("%d",&T);
	for(tc=0;tc<T;tc++){
		int i,j;
		scanf("%d %d %d %d",&N,&M,&SR,&SC);
		//So luong dam chay
		scanf("%d",&K);
		for(i=0;i<K;i++){
			scanf("%d %d",&fire[i].x,&fire[i].y);
			map[fire[i].x][fire[i].y]=1;
		}
		//so luong ho nuoc
		scanf("%d",&L);
		for(i=0;i<L;i++){
			scanf("%d %d",&lake[i].x,&lake[i].y);
			map[lake[i].x][lake[i].y]=2;
		}
		//so luong loi thoat
		scanf("%d",&E);
		for(i=0;i<E;i++){
			scanf("%d %d",&exit[i].x,&exit[i].y);
			mapExit[exit[i].x][exit[i].y]=1;
		}
		//kc
		for(i=1;i<=N;i++){
			for(j=1;j<=M;j++){
				visited[i][j]=0;
				scanf("%d",&mapKc[i][j]);
			}
		}
		chay_lan();
		for(i=1;i<=N;i++){
			for(j=1;j<=M;j++){
				if(mapTimeFire[i][j]==0){
					mapTimeFire[i][j]=99;
				}
			}
		}
		kq=-1;
		visited[SR][SC]=1;
		Point start = {SR,SC};
		hugo_chay(start,1,mapKc[SR][SC]);
		printf("Case #%d\n%d\n",tc+1,kq);
		reset();
	}
	return 0;
}
Editor is loading...
Leave a Comment