#include <iostream>
#include<queue>
using namespace std;
char maze[200][200];
int used[200][200][10];
int direct[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
class node{
public:
int x,y;
int time;
};
int bfs(node start,int m,int n,int p,int t){
queue<node>q;
q.push(start);
while(!q.empty()){
node now,next;
now=q.front();
q.pop();
for(int i=0;i<4;i++){
next.x=now.x+direct[i][0];
next.y=now.y+direct[i][1];
if(maze[next.x][next.y]=='+'&&now.time<p){
return now.time+1;
}
if(next.x>=0&&next.x<m&&next.y>=0&&next.y<n&&maze[next.x][next.y]!='#'){
if(maze[next.x][next.y]=='@'){
next.time=now.time+1;
if(next.time<t){
next.time=next.time*2;
maze[next.x][next.y]='#';
q.push(next);
}
}
if(maze[next.x][next.y]=='*'){
next.time=now.time+1;
maze[next.x][next.y]='#';
q.push(next);
}
}
}
}
return -1;
}
int main() {
int m,n,t,p;
cin>>m>>n>>t>>p;
node start;
start.time=0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
cin>>maze[i][j];
if(maze[i][j]=='!'){
start.x=i;
start.y=j;
}
}
}
maze[start.x][start.y]='#';
cout<<bfs(start,m,n,p,t)<<endl;
return 0;
}
直接暴力广搜,注意大嘴花的判定条件