唉,上午一直不在状态,都没有好好思考,基本上算是看的题解,切记做题一定要专注,一定要多思考,不能轻易的看题解了,这道题可以把'/'和'\'转化,用0和1表示,
'/'表示为 :'\'表示为
001100
010010
100001
相当于扩大了三倍,最后结果除以三就ok了
然后就可以用普通的搜索求了,还是连通问题,注意一点只要是遍历到处于边缘的0就说明这个一定不是环,wa了一次,还是没注意到每组案例之间都有一个空行;休息会,再奋战。
上代码:(基本上跟别人写的一样)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int map[300][300];
char a[100];
int dx[4]={-1,0,0,1};
int dy[4]={0,-1,1,0};
int w,h,flag,sum,ans;
void dfs(int x,int y)
{
map[x][y] = 1;
for(int i=0; i<4; i++)
{
int xx = x+dx[i];
int yy = y+dy[i];
if(xx>=0&&yy>=0&&xx<3*h&&yy<3*w)
{
if(map[xx][yy]==0)
{
sum++;
dfs(xx,yy);
}
}
else
{
flag = 0;
}
}
}
int main()
{
int i,j;
int num = 0;
while(scanf("%d%d",&w,&h),w+h)
{
num++;
getchar();
memset(map,0,sizeof(map));
for(i=0; i<h; i++)
{
gets(a);
for(j=0; j<w; j++)
{
if(a[j]=='/')
{
map[3*i][3*j+2] = 1;
map[3*i+1][3*j+1] = 1;
map[3*i+2][3*j] = 1;
}
else
{
map[3*i][3*j] = 1;
map[3*i+1][3*j+1] = 1;
map[3*i+2][3*j+2] = 1;
}
}
}
/*for(i=0; i<3*h; i++)
{
for(j=0; j<3*w; j++)
{
printf("%d ",map[i][j]);
}
puts("");
}*/
int max = 0;
ans = 0;
for(i=0; i<3*h; i++)
{
for(j=0; j<3*w; j++)
{
if(map[i][j]==0)
{
sum = 1;
flag = 1;
dfs(i,j);
if(flag == 1)
{
++ans;
if(sum > max)
max = sum;
}
}
}
}
printf("Maze #%d:\n",num);
if(ans == 0)
{
printf("There are no cycles.\n");
}
else
{
printf("%d Cycles; the longest has length %d.\n",ans,max/3);
// printf("ans = %d\n",ans);
}
puts("");
}
return 0;
}