Untitled

 avatar
unknown
plain_text
2 years ago
1.7 kB
4
Indexable
#include<iostream>

using namespace std;
int m,n;
char M[400][400];
int vs[400][400];
char Qx[100000];
char Qy[100000];//>maxsize
int Qd[100000];
int r=-1,f=-1;
int d[400][400];
void push(int x, int y, int d){
	r++;
	Qx[r]=x;
	Qy[r]=y;
	Qd[r]=d;
}

void pop(int &x, int &y, int &d)
{
	f++;
	x=Qx[f];
	y=Qy[f];
	d=Qd[f];
}
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
bool checkbien(int x, int y)
{
	if(x<0||y<0||x>=m||y>=n) return false;
	return true;
}

int BFS(int  x, int y, int d, int ex, int ey)
{
	
	push(x,y,d);
	while(r!=f){
		pop(x,y,d);
		//kt lan kan
		bool ok=true;
		if(checkbien(x,y)){
			for(int i=0;i<4;i++){
			//issafe
				int xx=x+dx[i];
				int yy=y+dy[i];
				if(M[xx][yy]=='E' && d+1< vs[xx][yy]){
					push(xx,yy,d+1);
					vs[xx][yy]=d+1;
				}
				else if(M[xx][yy]=='B' && d+2 < vs[xx][yy]){
					push(xx,yy,d+2);
					vs[xx][yy]=d+2;
				}
				else if(M[xx][yy]=='T'){
					vs[xx][yy]=d+1;
					//return vs[ex][ey];
				}
				
			}
		}
		
	}
	//if(vs[ex][ey]==999999) vs[ex][ey]=-1;
	return vs[ex][ey];
	//return -1;
}
int main(){
	freopen("input.txt","r",stdin);
	int t;
	cin>>t;
	int tx,ty,yx,yy;;
	int f=-1,r=-1;
	for(int tc=1;tc<=t;tc++){
		cin>>m>>n;
		//reset
		for(int i=0;i<m;i++){
			for(int j=0;j<n;j++){
				vs[i][j]= 999999;
			}
		}
		//NHAP DAU VAO
		for(int i=0;i<m;i++){
			cin>>M[i];
		}
		for(int i=0;i<m;i++){
			for(int j=0;j<n;j++){
				if(M[i][j]=='Y'){
					yx=i;yy=j;
				}
				else if(M[i][j]=='T'){
					tx=i;ty=j;
				}
			}
		}
		//cout << tx <<" " << ty<< endl;
		//cout << "Case #"<<tc<<endl;
		cout<< BFS(yx,yy,0,tx,ty)<<endl;
		//cout << yx <<" " << yy<< endl;
	}
	return 0;
}
Editor is loading...