Source Code
import java.io.*;
import java.util.*;

/**
 * Made by egor https://github.com/chermehdi/egor.
 *
 * @author Azuz 
 *
 */
public class Main {

  private static final int BOT = 0, LEFT = 1, TOP = 2, RIGHT = 3;
  int n, m;
  int[][][] dp;
  char[][] arr;
  int[][][] last;
  int current;

  void solve(InputReader in, PrintWriter out) {
    n = in.nextInt();
    m = in.nextInt();
    arr = new char[n][];
    dp = new int[n][m][4];
    last = new int[n][m][4];

    for (int i = 0; i < n; ++i) {
      arr[i] = in.next().toCharArray();
      for (int j = 0; j < m; ++j)
        Arrays.fill(dp[i][j], -1);
    }

    int ans = 0;
    current = 1;
    for (int i = 0; i < n; ++i) {
      for (int j = 0; j < m; ++j) if (arr[i][j] == '.') {
        int count = 0;

        for (int dir = 0; dir < 4; ++dir) {
          int toAdd = solve(i, j, dir);

          count += toAdd;
        }
        ans = Math.max(ans, count);
        ++current;
      }
    }

    out.println(ans);

  }

  public int solve(int i, int j, int dir) {

    if (i < 0 || j < 0 || i >= n || j >=m) return 0;
    
    if (last[i][j][dir] == current) return 0;
    int toAdd = 1;
    for (int x = 0; x < 4; ++x) {
      if (last[i][j][x] == current) {
        toAdd = 0;
        break;
      }
    }

    last[i][j][dir] = current;

    if (dp[i][j][dir] >= 1) {
      return dp[i][j][dir] - (toAdd == 0 ? 1 : 0);
    }

    
    int ret = 0;
    if (arr[i][j] == '#') return dp[i][j][dir] = 0;
    else if (arr[i][j] == '\\') {
      if (dir == BOT) ret = solve(j + 1, i, RIGHT);
      else if (dir == LEFT) ret = solve(i - 1, j, TOP);
      else if (dir == RIGHT) ret = solve(i + 1, j, BOT);
      else ret = solve(i, j - 1, LEFT);
    } else if (arr[i][j] == '/') {
      if (dir == BOT) ret = solve(i, j - 1, LEFT);
      else if (dir == LEFT) ret = solve(i + 1, j, BOT);
      else if (dir == RIGHT) ret = solve(i - 1, j, TOP);
      else ret = solve(i, j + 1, RIGHT);
    } else {
      if (dir == BOT) ret = solve(i + 1, j, dir);
      else if (dir == TOP) ret = solve(i - 1, j, dir);
      else if (dir == RIGHT) ret = solve(i, j + 1, dir);
      else ret = solve(i, j - 1, dir);
      ret += toAdd;
    }

    return dp[i][j][dir] = ret;
  }

  public static void main(String[] args) {
    InputReader in = new InputReader(System.in);
    try (PrintWriter out = new PrintWriter(System.out)) {
      new Main().solve(in, out);
    }
  }
}

class InputReader  {

  private InputStream stream;
  private static final int DEFAULT_BUFFER_SIZE = 1 << 16;
  private static final int EOF = -1;
  private byte[] buf = new byte[DEFAULT_BUFFER_SIZE];
  private int curChar;
  private int numChars;

  public InputReader(InputStream stream) {
    this.stream = stream;
  }

  public int[] readIntArray(int tokens) {
    int[] ret = new int[tokens];
    for (int i = 0; i < tokens; i++) {
      ret[i] = nextInt();
    }
    return ret;
  }

  public int read() {
    if (this.numChars == EOF) {
      throw new UnknownError();
    } else {
      if (this.curChar >= this.numChars) {
        this.curChar = 0;

        try {
          this.numChars = this.stream.read(this.buf);
        } catch (IOException ex) {
          throw new InputMismatchException();
        }

        if (this.numChars <= 0) {
          return EOF;
        }
      }

      return this.buf[this.curChar++];
    }
  }

  public int nextInt() {
    int c;
    for (c = this.read(); isSpaceChar(c); c = this.read()) {
    }

    byte sgn = 1;
    if (c == 45) {
      sgn = -1;
      c = this.read();
    }

    int res = 0;

    while (c >= 48 && c <= 57) {
      res *= 10;
      res += c - 48;
      c = this.read();
      if (isSpaceChar(c)) {
        return res * sgn;
      }
    }

    throw new InputMismatchException();
  }

  public long nextLong() {
    int c;
    for (c = this.read(); isSpaceChar(c); c = this.read()) {
    }

    byte sgn = 1;
    if (c == 45) {
      sgn = -1;
      c = this.read();
    }

    long res = 0;

    while (c >= 48 && c <= 57) {
      res *= 10L;
      res += c - 48;
      c = this.read();
      if (isSpaceChar(c)) {
        return res * sgn;
      }
    }
    throw new InputMismatchException();
  }

  public double nextDouble() {
    double ret = 0, div = 1;
    int c = read();
    while (c <= ' ') {
      c = read();
    }
    boolean neg = (c == '-');
    if (neg) {
      c = read();
    }

    do {
      ret = ret * 10 + c - '0';
    }
    while ((c = read()) >= '0' && c <= '9');

    if (c == '.') {
      while ((c = read()) >= '0' && c <= '9') {
        ret += (c - '0') / (div *= 10);
      }
    }

    if (neg) {
      return -ret;
    }
    return ret;
  }

  public String next() {
    int c;
    while (isSpaceChar(c = this.read())) {
    }

    StringBuilder result = new StringBuilder();
    result.appendCodePoint(c);

    while (!isSpaceChar(c = this.read())) {
      result.appendCodePoint(c);
    }

    return result.toString();
  }

  public String nextLine() {
    int c;
    StringBuilder result = new StringBuilder();
    boolean read = false;
    while ((c = this.read()) != '\n') {
      if (c == -1) {
        return null;
      }
      result.appendCodePoint(c);
      read = true;
    }
    if (!read) {
      return null;
    }
    return result.toString();
  }

  public static boolean isSpaceChar(int c) {
    return c == 32 || c == 10 || c == 13 || c == 9 || c == EOF;
  }

  public int[] nextIntArray(int n) {
    int[] arr = new int[n];
    for (int i = 0; i < n; i++) {
      arr[i] = nextInt();
    }
    return arr;
  }

  public long[] nextLongArray(int n) {
    long[] arr = new long[n];
    for (int i = 0; i < n; i++) {
      arr[i] = nextLong();
    }
    return arr;
  }

  public int[][] nextIntMatrix(int n, int m) {
    int[][] arr = new int[n][m];
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        arr[i][j] = nextInt();
      }
    }
    return arr;
  }

  public long[][] nextLongMatrix(int n, int m) {
    long[][] arr = new long[n][m];
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        arr[i][j] = nextLong();
      }
    }
    return arr;
  }

  public char[] nextCharArray() {
    return next().toCharArray();
  }

  public double[] nextDoubleArray(int n) {
    double[] ret = new double[n];
    for (int i = 0; i < n; i++) {
      ret[i] = nextDouble();
    }
    return ret;
  }

  public int[]
  nextIntArrayOneBased(int n) {
    int[] ret = new int[n + 1];
    for (int i = 1; i <= n; i++) {
      ret[i] = nextInt();
    }
    return ret;
  }

  public char[][] nextCharMatrix(int n, int m) {
    char[][] res = new char[n][m];
    for (int i = 0; i < n; ++i) {
      res[i] = nextCharArray();
    }
    return res;
  }
}
Copy
Mirrors Azuz
Java 11
68 ms
13.6 MB
Wrong Answer