Q1)
 
 #include <iostream>
 #include<bits/stdc++.h>
 using namespace std;
 int shortest_time(int n,int m,vector<vector<int>>&matrix,int p){
   vector<vector<int>>distance(n,vector<int>(m,INT_MAX));
   set<pair<int,pair<int,int>>>s;
   distance[0][0]=0;
   s.insert({0,{0,0}});
   int drow[]={0,0,1,-1};
   int dcol[]={1,-1,0,0};
   while(!s.empty()){
       auto it=s.begin();
       int r=(*it).second.first;
       int c=(*it).second.second;
       int d=(*it).first;
       s.erase(it);
       for(int i=0;i<=3;i++){
          int r1=r+drow[i];
          int c1=c+dcol[i];
          if(0<=r1&&r1<n&&0<=c1&&c1<m&&(matrix[r1][c1]==p||matrix[r1][c1]==0)&&1+d< distance[r1][c1]){
              distance[r1][c1]=min(distance[r1][c1],1+d);
              
              if(r1==n-1&&c1==m-1){
                  return 1+d;
              }
              s.insert({distance[r1][c1],{r1,c1}});
          }
       }
      
   }
    return -1;
 }
 int main()
 {
    int n,m;
    cin>>n>>m;
    vector<vector<int>>maze(n,vector<int>(m,0));
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            char k;
            cin>>k;
            if(k=='*'){
                maze[i][j]=1;
                
            }else if(k=='#'){
                maze[i][j]=2;
            }else{
                maze[i][j]=0;
            }
        }
    }
    int p1=shortest_time(n,m,maze,1);
    int p2=shortest_time(n,m,maze,2);
    cout<<p1<<endl;
    cout<<p2<<endl;
 }