唉,上午一直不在状态,都没有好好思考,基本上算是看的题解,切记做题一定要专注,一定要多思考,不能轻易的看题解了,这道题可以把‘/‘和‘\‘转化,用0和1表示,
‘/‘表示为 :
‘\‘表示为
001
100
010
010
100
001
相当于扩大了三倍,最后结果除以三就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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-06 13:39:20