http://hi.baidu.com/11magic/item/b0d72a77d76ea122d7a89cfb
UVA 的斜线迷宫题 真的学到不少
http://wenku.baidu.com/view/8ed5b30702020740be1e9bfb.html
View Code
#include<stdio.h> #include<string.h> #include<iostream> #include<queue> #define clr(a,b); memset(a,b,sizeof(a)); using namespace std; int m,n; int h_maze,w_maze; char map[80][80]; int a[300][300]; int num_case=0; int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; //FloodFill算法 int FloodFill(int x,int y) { if(x<0||x>=h_maze||y<0||y>=w_maze) return 0; if(a[x][y]!=0) return 0; a[x][y]=1; int sum=1; for(int i=0;i<4;i++) sum+=FloodFill(x+dir[i][0],y+dir[i][1]); return sum; } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); while(scanf("%d%d",&m,&n)!=EOF) { if(m==0&&n==0) break; clr(a,0); clr(map,0); getchar(); //输入以及将图扩充三倍的大小 for(int i=0;i<n;i++) gets(map[i]); for(int i=0;i<n;i++) for(int j=0;j<m;j++) { if(map[i][j]=='/') { a[3*i+2][3*j]=1; a[3*i+1][3*j+1]=1; a[3*i][3*j+2]=1; } if(map[i][j]=='\\') { a[3*i][3*j]=1; a[3*i+1][3*j+1]=1; a[3*i+2][3*j+2]=1; } } h_maze=3*n; w_maze=3*m; //从图的边缘填充,把不构成环的联通图外空间的点全部都给涂满。 for(int i=0;i<h_maze;i++) { FloodFill(i,0); FloodFill(i,w_maze-1); } for(int i=0;i<w_maze;i++) { FloodFill(0,i); FloodFill(h_maze-1,i); } int max=0; int sum=0; for(int i=0;i<h_maze;i++) { for(int j=0;j<w_maze;j++) { int result=FloodFill(i,j)/3; if(result) { max=result>max?result:max; sum++; } } } printf("Maze #%d:\n",++num_case); if(sum) { printf("%d Cycles; the longest has length %d.\n",sum,max); } else printf("There are no cycles.\n"); printf("\n"); /*for(int i=0;i<3*n;i++) { for(int j=0;j<3*m;j++) { printf("%d",a[i][j]); } printf("\n"); }*/ } return 0; }