从K点开始bfs,并记录当前队列中属于bfs的第几层,当到达H点时,输出层数即可。
- #include
- using namespace std;
- #define rep(i,a,n) for(int i = a;i
- #define per(i,a,n) for(int i = n-1;i>=a;i--)
- #define pb push_back
- #define mp make_pair
- #define eb emplace_back
- #define all(x) (x).begin(),(x).end()
- #define fi first
- #define se second
- #define SZ(x) ((int)(x).size())
- #define yes cout<<"YES"<<'\n';
- #define no cout<<"NO"<<'\n';
- #define endl '\n';
- #define R register
- typedef vector<int> VI;
- typedef long long ll;
- typedef unsigned long long ull;
- typedef pair<int,int> PII;
- typedef double db;
- mt19937 mrand(random_device{}());
- const ll MOD=1000000007;
- int rnd(int x) {return mrand() % x;}
- ll gcd(ll a,ll b){return b?gcd(b,a%b):a;};
- ll lcm(int a,int b){return a*b/gcd(a,b);};
-
- int n,m;
- int dx[8]={-1,-2,-2,-1,1,2,2,1};
- int dy[8]={-2,-1,1,2,2,1,-1,-2};
-
- int main(){
- ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
- cin>>m>>n;
- vector
g(n) ; - rep(i,0,n) cin>>g[i];
- queue
q; - rep(i,0,n){
- rep(j,0,m){
- if(g[i][j]=='K'){
- q.push({i,j});
- g[i][j]='*';
- break;
- }
- }
- if(!q.empty()) break;
- }
- int len=1;
- while(!q.empty()){
- int sz=SZ(q);
- while(sz--){
- auto [x,y]=q.front();
- q.pop();
- rep(i,0,8){
- int xx=x+dx[i],yy=y+dy[i];
- if(xx<0||xx>=n||yy<0||yy>=m||g[xx][yy]=='*') continue;
- if(g[xx][yy]=='H'){
-