Flood Fill 算法

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;
}
原文地址:https://www.cnblogs.com/whatthefy/p/3052381.html