这题想了好久都是蒙的,完全无从下手,后来看了题解,才发现自己忽略了一个东西就是那个图,另外还理解错了
题意,注意他要求的是封闭路径的长度,而不是所占的格子的数目,然后看那个图可以知道每个斜线的长度是二,
套用脑子聪明的人的话就是很容易想到把矩阵扩充为原理的2倍。
\ /
1 0 0 1
0 1 1 0
然后从八个方向搜,是零的都可以走,但是注意特判,因为斜着的方向又不符合的,这个很容易想到。
另外还有大神想到了用光学平面镜的原理,这个代码更加麻烦,原理很容易想到,不再多说,想了解的
可以查一下大牛的题解。
然而本弱渣喜欢最简单有效的方法,虽然一般我想不到,最简单的方法,就是把矩阵扩充为3倍,然后就可以四个方向搜了,
虽然我并不是很理解为什么四个方向搜就可以了,另外搜索的时候,搜到边界即不满足条件,f=0,然而对于递归为什么是那么写的,
以及为什么f=0是在那里,以我对于递归的认识,也并不能理解的很透彻,模仿大牛的代码敲了一下代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
#include<cctype>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<stack>
#include<ctime>
#include<algorithm>
#include<sstream>
#define LL long long
using namespace std;
int w,h;
int dx[4]={-1,0,0,1},dy[4]={0,-1,1,0};
int grid[400][400];
int pos,f,sum,Max;
void dfs(int x,int y)
{
for(int i=0;i<4;i++)
{
int ax=x+dx[i];
int ay=y+dy[i];
if(ax>=0&&ax<3*h&&ay>=0&&ay<3*w)
{
if(grid[ax][ay]==0)
{
++pos;
grid[ax][ay]=1;
dfs(ax,ay);
}
}
else
f=0;
}
}
int main()
{
int cas=0;
while(cin>>w)
{
cin>>h;
if(!w&&!h) break;
getchar();
cas++;
memset(grid,0,sizeof(grid));
for(int i=0;i<h;i++)
{
string s;
cin>>s;
for(int j=0;j<w;j++)
{
if(s[j]=='\\')
{
grid[i*3][j*3]=1;
grid[i*3+1][j*3+1]=1;
grid[i*3+2][j*3+2]=1;
}
else
{
grid[i*3+2][j*3]=1;
grid[i*3+1][j*3+1]=1;
grid[i*3][j*3+2]=1;
}
}
}
sum=0;Max=0;
for(int i=0;i<3*h;i++)
for(int j=0;j<3*w;j++)
{
if(grid[i][j]==0)
{
grid[i][j]=1;
pos=1;f=1;
dfs(i,j);
if(f)
{
sum++;
Max=max(Max,pos);
}
}
}
if(sum==0) printf("Maze #%d:\nThere are no cycles.\n\n",cas);
else
printf("Maze #%d:\n%d Cycles; the longest has length %d.\n\n",cas,sum,Max/3);
}
return 0;
}