题解是建图
#include<bits/stdc++.h>
using namespace std;
const int d[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int n,m,sx,sy,tx,ty;
char s[505][505];
bool vis[505][505];
struct node{
int x,y,step;
inline bool operator <(const node &o) const{
return step>o.step;
}
};
priority_queue<node> q;
inline bool check(int x,int y){
return x>=1&&x<=n&&y>=1&&y<=m;
}
inline void BFS(){
q.push(node({sx,sy,0}));
while(q.size()){
node u=q.top();
q.pop();
if(u.x==tx&&u.y==ty){
cout<<u.step<<endl;
return;
}
if(vis[u.x][u.y])
continue;
vis[u.x][u.y]=1;
int X[4],Y[4],cost=1e9;
memset(X,-1,sizeof(X));
memset(Y,-1,sizeof(Y));
for(int i=0;i<4;++i){
int dx=u.x+d[i][0],dy=u.y+d[i][1];
if(!check(dx,dy))
continue;
if(s[dx][dy]=='#'){
cost=0;
continue;
}
q.push(node({dx,dy,u.step+1}));
int cnt=1;
while(check(dx+d[i][0],dy+d[i][1])&&s[dx+d[i][0]][dy+d[i][1]]!='#'){
++cnt;
dx+=d[i][0],dy+=d[i][1];
}
X[i]=dx,Y[i]=dy,cost=min(cost,cnt);
}
if(cost==1e9)
continue;
for(int i=0;i<4;++i)
if((~X[i])&&(~Y[i]))
q.push(node({X[i],Y[i],u.step+cost+1}));
}
puts("nemoguce");
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j){
cin>>s[i][j];
if(s[i][j]=='C')
sx=i,sy=j;
if(s[i][j]=='F')
tx=i,ty=j;
}
BFS();
return 0;
}