算法
(模拟+暴力) $O(NM)$
1)首先证明进入不了环:
反证法:假设可以进入环,则由光路可逆原理,
从进入环的后往回走,一定会碰到下一个位置即在
环内,又走出了环(怎么进怎么出),矛盾,故进不了环。
2)再证从4条边进入的复杂度为O(NM)
引理1:射入后光路一定 证明:显然成立
引理2:一个位置的一种状态(上下左右)只能被走一次。
反证法:假设被走2次,则存在2个不同的起点到达
该位置的同一状态,由光路可逆,从该位置该状态往回走
路径不唯一,矛盾。
由引理1与引理2,每个点4个状态,则最多被访问4次,2)成立。
剩下代码可以用异或简化,请自行推导。
C++ 代码
#include<bits/stdc++.h>
using namespace std;
char mp[1010][1010];
int n,m,dx[4] = {0,0,-1,1},dy[] = {-1,1,0,0};
int dfs(int i,int j,int st){
if(i>=0&&i<n&&j>=0&&j<m){
int ret = 1;
if(mp[i][j] == '/')ret += dfs(i+dx[st],j+dy[st],st^3);
else ret += dfs(i+dx[st^1],j+dy[st^1],st^2);
return ret;
}
else return 0;
}
int main(){
cin>>n>>m;
for(int i = 0;i<n;++i)cin>>mp[i];
int ans = 0;
for(int i = 0;i<n;++i)ans = max(ans,dfs(i,0,2)),ans = max(ans,dfs(i,m-1,3));
for(int i = 0;i<m;++i)ans = max(ans,dfs(0,i,0)),ans = max(ans,dfs(n-1,i,1));
cout<<ans;
return 0;
}