題目鏈接:跳舞的線 - 亂拐彎
顯然到一個點之後,方向是有關係的,所以我們多加一個狀態存方向即可。
AC代碼:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=1e3+10;
int n,m,mi[N][N][2],mx[N][N][2]; char g[N][N];
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++) scanf("%s",g[i]+1);
memset(mi,0x3f,sizeof mi); mi[1][1][0]=mi[1][1][1]=0;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(g[i][j]=='o'){
if(i>1){
mi[i][j][1]=min(mi[i-1][j][1],mi[i-1][j][0]+1);
mx[i][j][1]=max(mx[i-1][j][1],mx[i-1][j][0]+1);
}
if(j>1){
mi[i][j][0]=min(mi[i][j-1][0],mi[i][j-1][1]+1);
mx[i][j][0]=max(mx[i][j-1][0],mx[i][j-1][1]+1);
}
}
if(g[1][1]=='#'||min(mi[n][m][0],mi[n][m][1])>=0x3f3f3f3f) return puts("-1"),0;
cout<<max(max(mx[n][m][0],mx[n][m][1])-1,0)<<' '<<min(mi[n][m][0],mi[n][m][1]);
return 0;
}