HuGo
duyvan
plain_text
2 years ago
2.8 kB
22
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