1 #include <cstdio>
2 #include <cstring>
3 #include <algorithm>
4 #include <iostream>
5 using namespace std;
6 const int mo=500000,dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
7 struct edge { int x,y; }st,en;
8 int d[mo+1][2],dis[501][501],bz[501][501],a[501][501],f[501][501][4],n,m;
9 char map[501][501];
10 void bfs()
11 {
12 int tail=0,head=1;
13 memset(a,127,sizeof(a));
14 for (int i=1;i<=n;i++)
15 for (int j=1;j<=m;j++)
16 if (map[i][j]=='#')
17 d[++tail][0]=i,d[tail][1]=j,a[i][j]=0;
18 while (head<tail)
19 {
20 head++;
21 int u=d[head][0],v=d[head][1];
22 for (int i=0;i<4;i++)
23 {
24 int x=u+dx[i],y=v+dy[i];
25 if (x>n||y>m||x<1||y<1||a[u][v]+1>=a[x][y]) continue;
26 d[++tail][0]=x,d[tail][1]=y;
27 a[x][y]=a[u][v]+1;
28 }
29 }
30 }
31 void spfa()
32 {
33 int head=0,tail=1;
34 while (head<tail)
35 {
36 head=head%mo+1;
37 int u=d[head][0],v=d[head][1];
38 bz[u][v]=0;
39 for (int i=0;i<4;i++)
40 {
41 int x=u+dx[i],y=v+dy[i];
42 if ((map[x][y]=='#')||(dis[u][v]+1>=dis[x][y])) continue;
43 dis[x][y]=dis[u][v]+1;
44 if (bz[x][y]) continue;
45 bz[x][y]=1;
46 tail=tail%mo+1;
47 d[tail][0]=x,d[tail][1]=y;
48 }
49 for (int i=0;i<4;i++)
50 {
51 int x=u,y=v;
52 if (i>1) x=f[u][v][i]; else y=f[u][v][i];
53 if (dis[u][v]+a[u][v]>=dis[x][y]) continue;
54 dis[x][y]=dis[u][v]+a[u][v];
55 if (bz[x][y]) continue;
56 bz[x][y]=1;
57 tail=tail%mo+1;
58 d[tail][0]=x,d[tail][1]=y;
59 }
60 }
61 }
62 int main()
63 {
64 freopen("cell.in","r",stdin);
65 freopen("cell.out","w",stdout);
66 scanf("%d%d",&n,&m);
67 memset(dis,127,sizeof(dis));
68 for (int i=1;i<=n;i++)
69 {
70 scanf("%s",map[i]+1);
71 for (int j=1;j<=m;j++)
72 if (map[i][j]=='C') st.x=i,st.y=j,dis[i][j]=0;
73 else if (map[i][j]=='F') en.x=i,en.y=j;
74 }
75 for (int i=1;i<=n;i++)
76 {
77 f[i][1][0]=1;
78 for (int j=2;j<=m;j++) if (map[i][j-1]=='#') f[i][j][0]=j; else f[i][j][0]=f[i][j-1][0];
79 f[i][m][1]=m;
80 for (int j=m-1;j;j--) if (map[i][j+1]=='#') f[i][j][1]=j; else f[i][j][1]=f[i][j+1][1];
81 }
82
83 for (int j=1;j<=m;j++)
84 {
85 f[1][j][2]=1;
86 for (int i=2;i<=n;i++) if (map[i-1][j]=='#') f[i][j][2]=i; else f[i][j][2]=f[i-1][j][2];
87 f[n][j][3]=n;
88 for (int i=n-1;i;i--) if (map[i+1][j]=='#') f[i][j][3]=i; else f[i][j][3]=f[i+1][j][3];
89 }
90 bfs();
91 memset(bz,0,sizeof(bz));
92 d[1][0]=st.x,d[1][1]=st.y;
93 spfa();
94 if (dis[en.x][en.y]>1e9) printf("no\n");
95 else printf("%d\n",dis[en.x][en.y]);
96 }