Source Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define ss second
#define ff first
#define pb push_back
#define mp make_pair
char r[1010][1010];
vector<int> v[1010][1010];
int n,m;
bool ok[1010][1010][4];

int cr;
int ff(int g){
    if(g==0)g=1;
    else if(g==1)g=0;
    else if(g==2)g=3;
    else g=2;
    return g;
}
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
map<pair<int,int>,int> mm;
void go(int x,int y,int f){
    if(x<0||y<0||y>m+1||x>n+1)return;
    if(r[x][y]=='#'){f=ff(f);
    ok[x][y][f]=1;return;}
    if(r[x][y]=='.'){
        v[x][y].pb(cr);
        //if(x==2&&y==1)cout<<x<<' '<<y<<' '<<f<<' '<<cr<<endl;
        int newx=x+dx[f],newy=y+dy[f];
        go(newx,newy,f);
        return;
    }
    int h=ff(f);
    ok[x][y][h]=1;
    if(r[x][y]=='\\'){

            if(f==3){
                if(ok[x][y][1])return;
                ok[x][y][1]=1;
                go(x,y-1,1);
            }
            if(f==2){
                if(ok[x][y][0])return;
                ok[x][y][0]=1;
                go(x,y+1,0);
            }
            if(f==0){
                if(ok[x][y][2])return;
                ok[x][y][2]=1;
                go(x+1,y,2);
            }
            if(f==1){
                if(ok[x][y][3])return;
                ok[x][y][3]=1;
                go(x-1,y,3);
            }
    }
   // if(cr==8)cout<<x<<' '<<y<<' '<<f<<endl;
    if(r[x][y]=='/'){
            if(f==3){
                    if(ok[x][y][0])return;
                ok[x][y][0]=1;
                go(x,y+1,0);
            }
            if(f==2){
                if(ok[x][y][1])return;
                ok[x][y][1]=1;
                go(x,y-1,1);
            }
            if(f==0){
                if(ok[x][y][3])return;
                ok[x][y][3]=1;
                go(x-1,y,3);
            }
            if(f==1){
                if(ok[x][y][2])return;
                ok[x][y][2]=1;
                go(x+1,y,2);
            }
    }

}
map<int,int> m1;
int main(){
    //cout<<'\\';
    cin>>n>>m;
    for(int i=0;i<=n+1;i++){
        for(int j=0;j<=m+1;j++)r[i][j]='#';
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++)cin>>r[i][j];
    }
    for(int i=0;i<=n+1;i++){
        for(int j=0;j<=m+1;j++){
                if(r[i][j]=='.')continue;
                for(int k=0;k<4;k++){
                    if(ok[i][j][k])continue;
                    int newx=i+dx[k],newy=j+dy[k];
                    if(newx<0||newy<0||newx>n+1||newy>m+1)continue;
                    if(r[i][j]=='#'){
                        ok[i][j][k]=1;
                        go(newx,newy,k);
                        //int h=ff(k);
                        //go(i,j,k);
                    }
                    else{int h=ff(k);
                        ok[i][j][k]=1;
                        go(newx,newy,k);
                        //cout<<h<<"    "<<k<<endl;
                        go(i,j,h);
                    }
                    cr++;
                }
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(r[i][j]!='.')continue;
            mm[mp(v[i][j][0],v[i][j][1])]++;
            m1[v[i][j][0]]++;
            m1[v[i][j][1]]++;

        }
    }
    int ans=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(r[i][j]!='.')continue;
            ans=max(ans, m1[v[i][j][0]]+ m1[v[i][j][1]]-mm[mp(v[i][j][0],v[i][j][1])]);

        }
    }
    cout<<ans;
    return 0;
}
 /*
1 10 -10

 */
Copy
Mirrors Wesam
GNU G++17
16 ms
24.6 MB
Wrong Answer