#include <iostream>
using namespace std;
int const MAXN=76;
struct node
{
int prex,prey,preid;
};
node pre[MAXN][MAXN][2];
char map[MAXN][MAXN];
int visited[MAXN][MAXN][2];
int w,h;
int length;
int path[MAXN][MAXN][2];
int startpath=0;
int vislen;
bool inrange(int x,int y)
{
if(x>=0&&x<h&&y>=0&&y<w)
return 1;
return 0;
}
bool DFS(int sx,int sy,int id)
{
//cout<<sx<<" "<<sy<<" "<<id<<" "<<path[sx][sy][id]<<endl;
visited[sx][sy][id]=true;
vislen++;
int nx,ny,nid;
if(map[sx][sy]=='//')
{
if(id==0)
{
nx=sx;
ny=sy-1;
nid=1;
if(inrange(nx,ny))
{
if(!visited[nx][ny][nid])
{
pre[nx][ny][nid].prex=sx;pre[nx][ny][nid].prey=sy;pre[nx][ny][nid].preid=id;
path[nx][ny][nid]=path[sx][sy][id]+1;
if(DFS(nx,ny,nid))
return true;
}
else
{
if((pre[sx][sy][id].prex!=nx||pre[sx][sy][id].prey!=ny||pre[sx][sy][id].preid!=nid)&&(pre[sx][sy][id].prex!=-1)&&(path[nx][ny][nid]>=startpath))
{
length=path[sx][sy][id]-path[nx][ny][nid]+1;
// cout<<path[sx][sy][id]<<"***"<<path[nx][ny][nid]<<"**"<<length<<endl;
return true;
}
}
}
nx=sx+1;
ny=sy;
if(inrange(nx,ny))
{
if(map[nx][ny]=='//')
nid=1;
else
nid=0;
if(!visited[nx][ny][nid])
{
pre[nx][ny][nid].prex=sx;pre[nx][ny][nid].prey=sy;pre[nx][ny][nid].preid=id;
path[nx][ny][nid]=path[sx][sy][id]+1;
if(DFS(nx,ny,nid))
return true;
}
else
{
if((pre[sx][sy][id].prex!=nx||pre[sx][sy][id].prey!=ny||pre[sx][sy][id].preid!=nid)&&(pre[sx][sy][id].prex!=-1)&&(path[nx][ny][nid]>=startpath))
{
length=path[sx][sy][id]-path[nx][ny][nid]+1;
// cout<<path[sx][sy][id]<<"***"<<path[nx][ny][nid]<<"**"<<length<<endl;
return true;
}
}
}
}
else
{
nx=sx;
ny=sy+1;
nid=0;
if(inrange(nx,ny))
{
if(!visited[nx][ny][nid])
{
pre[nx][ny][nid].prex=sx;pre[nx][ny][nid].prey=sy;pre[nx][ny][nid].preid=id;
path[nx][ny][nid]=path[sx][sy][id]+1;
if(DFS(nx,ny,nid))
return true;
}
else
{
if((pre[sx][sy][id].prex!=nx||pre[sx][sy][id].prey!=ny||pre[sx][sy][id].preid!=nid)&&(pre[sx][sy][id].prex!=-1)&&(path[nx][ny][nid]>=startpath))
{
length=path[sx][sy][id]-path[nx][ny][nid]+1;
//cout<<path[sx][sy][id]<<"***"<<path[nx][ny][nid]<<"**"<<length<<endl;
return true;
}
}
}
nx=sx-1;
ny=sy;
if(inrange(nx,ny))
{
if(map[nx][ny]=='//')
nid=0;
else nid=1;
if(!visited[nx][ny][nid])
{
pre[nx][ny][nid].prex=sx;pre[nx][ny][nid].prey=sy;pre[nx][ny][nid].preid=id;
path[nx][ny][nid]=path[sx][sy][id]+1;
if(DFS(nx,ny,nid))
return true;
}
else
{
if((pre[sx][sy][id].prex!=nx||pre[sx][sy][id].prey!=ny||pre[sx][sy][id].preid!=nid)&&(pre[sx][sy][id].prex!=-1)&&(path[nx][ny][nid]>=startpath))
{
length=path[sx][sy][id]-path[nx][ny][nid]+1;
//cout<<path[sx][sy][id]<<"***"<<path[nx][ny][nid]<<"**"<<length<<endl;
return true;
}
}
}
}
}
else
{
if(id==0)
{
nx=sx;
ny=sy-1;
nid=1;
if(inrange(nx,ny))
{
if(!visited[nx][ny][nid])
{
pre[nx][ny][nid].prex=sx;pre[nx][ny][nid].prey=sy;pre[nx][ny][nid].preid=id;
path[nx][ny][nid]=path[sx][sy][id]+1;
if(DFS(nx,ny,nid))
return true;
}
else
{
if((pre[sx][sy][id].prex!=nx||pre[sx][sy][id].prey!=ny||pre[sx][sy][id].preid!=nid)&&(pre[sx][sy][id].prex!=-1)&&(path[nx][ny][nid]>=startpath))
{
length=path[sx][sy][id]-path[nx][ny][nid]+1;
//cout<<path[sx][sy][id]<<"***"<<path[nx][ny][nid]<<"**"<<length<<endl;
return true;
}
}
}
nx=sx-1;
ny=sy;
if(inrange(nx,ny))
{
if(map[nx][ny]=='//')
nid=0;
else nid=1;
if(!visited[nx][ny][nid])
{
pre[nx][ny][nid].prex=sx;pre[nx][ny][nid].prey=sy;pre[nx][ny][nid].preid=id;
path[nx][ny][nid]=path[sx][sy][id]+1;
if(DFS(nx,ny,nid))
return true;
}
else
{
if((pre[sx][sy][id].prex!=nx||pre[sx][sy][id].prey!=ny||pre[sx][sy][id].preid!=nid)&&(pre[sx][sy][id].prex!=-1)&&(path[nx][ny][nid]>=startpath))
{
length=path[sx][sy][id]-path[nx][ny][nid]+1;
// cout<<path[sx][sy][id]<<"***"<<path[nx][ny][nid]<<"**"<<length<<endl;
return true;
}
}
}
}
else
{
nx=sx;
ny=sy+1;
nid=0;
if(inrange(nx,ny))
{
if(!visited[nx][ny][nid])
{
pre[nx][ny][nid].prex=sx;pre[nx][ny][nid].prey=sy;pre[nx][ny][nid].preid=id;
path[nx][ny][nid]=path[sx][sy][id]+1;
if(DFS(nx,ny,nid))
return true;
}
else
{
if((pre[sx][sy][id].prex!=nx||pre[sx][sy][id].prey!=ny||pre[sx][sy][id].preid!=nid)&&(pre[sx][sy][id].prex!=-1)&&(path[nx][ny][nid]>=startpath))
{
length=path[sx][sy][id]-path[nx][ny][nid]+1;
//cout<<length<<endl;
return true;
}
}
}
nx=sx+1;
ny=sy;
if(inrange(nx,ny))
{
if(map[nx][ny]=='//')
nid=1;
else nid=0;
if(!visited[nx][ny][nid])
{
pre[nx][ny][nid].prex=sx;pre[nx][ny][nid].prey=sy;pre[nx][ny][nid].preid=id;
path[nx][ny][nid]=path[sx][sy][id]+1;
if(DFS(nx,ny,nid))
return true;
}
else
{
if((pre[sx][sy][id].prex!=nx||pre[sx][sy][id].prey!=ny||pre[sx][sy][id].preid!=nid)&&(pre[sx][sy][id].prex!=-1)&&(path[nx][ny][nid]>=startpath))
{
length=path[sx][sy][id]-path[nx][ny][nid]+1;
//cout<<length<<endl;
return true;
}
}
}
}
}
return false;
}
int main()
{
freopen("input.txt","r",stdin);
int cas=1;
while(cin>>w>>h)
{
if(w==0&&h==0)
break;
memset(visited,0,sizeof(visited));
memset(path,-1,sizeof(path));
memset(pre,-1,sizeof(pre));
vislen=-1;
int i,j,k;
int cycle=0;
int MAXLEN=0;
for(i=0;i<h;i++)
cin>>map[i];
for(i=0;i<h;i++)
for(j=0;j<w;j++)
for(k=0;k<=1;k++)
{
length=0;
if(!visited[i][j][k])
{
// cout<<endl;
startpath=vislen+1;
pre[i][j][k].prex=pre[i][j][k].prey=pre[i][j][k].preid=-1;
path[i][j][k]=startpath;
if(DFS(i,j,k))
{
cycle++;
if(MAXLEN<length)
MAXLEN=length;
}
}
}
cout<<"Maze #"<<cas++<<":"<<endl;
if(cycle>0)
cout<<cycle<<" Cycles; the longest has length "<<MAXLEN<<"."<<endl;
else cout<<"There are no cycles."<<endl;
cout<<endl;
}
return 0;
}
一款非常好的锁屏APP软件: 酷划, 不仅好用, 而且还能赚钱, 官网地址: http://www.coohua.com