农场灌溉问题

描述

一农场由图所示的十一种小方块组成,蓝色线条为灌溉渠。若相邻两块的灌溉渠相连则只需一口水井灌溉。

农场灌溉问题_第1张图片

输入

给出若干由字母表示的最大不超过50×50具体由(m,n)表示,的农场图

输出

编程求出最小需要打的井数。每个测例的输出占一行。当M=N=-1时结束程序。

输入样例

2 2 DK HF 3 3 ADC FJK IHE -1 -1

输出样例

2 3

提示

参考迷宫问题,实现时关键要解决好各块的表示问题。

#include 
#include 
#include 

using namespace std;

char A[50][50];
int vis[150][150];
int G[150][150];
int p=0,m,n;

void dfs(int i,int j)
{
    if(G[i][j]==0)
    {
        G[i][j]=1;
    }
    if(i-1>=0&&G[i-1][j]==0) dfs(i-1,j);
    if(j-1>=0&&G[i][j-1]==0) dfs(i,j-1);
    if(i+1<3*m&&G[i+1][j]==0) dfs(i+1,j);
    if(j+1<3*n&&G[i][j+1]==0) dfs(i,j+1);
}

int main()
{
    int i,j,x,y;
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        memset(A,'\0',sizeof(A));
        memset(vis,0,sizeof(vis));
        p = 0;
        if(m==-1&&n==-1) break;
        getchar();
        for(i=0;i<m;i++){
            gets(A[i]);
        }
        for(i=0;i<m;i++){
            for(j=0;j'A':{
                        G[3*i][3*j]=1,G[3*i][3*j+1]=0,G[3*i][3*j+2]=1;
                        G[3*i+1][3*j]=0,G[3*i+1][3*j+1]=0,G[3*i+1][3*j+2]=1;
                        G[3*i+2][3*j]=1,G[3*i+2][3*j+1]=1,G[3*i+2][3*j+2]=1;
                    }break;
                    case'B':{
                        G[3*i][3*j]=1,G[3*i][3*j+1]=0,G[3*i][3*j+2]=1;
                        G[3*i+1][3*j]=1,G[3*i+1][3*j+1]=0,G[3*i+1][3*j+2]=0;
                        G[3*i+2][3*j]=1,G[3*i+2][3*j+1]=1,G[3*i+2][3*j+2]=1;
                    }break;
                    case'C':{
                        G[3*i][3*j]=1,G[3*i][3*j+1]=1,G[3*i][3*j+2]=1;
                        G[3*i+1][3*j]=0,G[3*i+1][3*j+1]=0,G[3*i+1][3*j+2]=1;
                        G[3*i+2][3*j]=1,G[3*i+2][3*j+1]=0,G[3*i+2][3*j+2]=1;
                    }break;
                    case'D':{
                        G[3*i][3*j]=1,G[3*i][3*j+1]=1,G[3*i][3*j+2]=1;
                        G[3*i+1][3*j]=1,G[3*i+1][3*j+1]=0,G[3*i+1][3*j+2]=0;
                        G[3*i+2][3*j]=1,G[3*i+2][3*j+1]=0,G[3*i+2][3*j+2]=1;
                    }break;
                    case'E':{
                        G[3*i][3*j]=1,G[3*i][3*j+1]=0,G[3*i][3*j+2]=1;
                        G[3*i+1][3*j]=1,G[3*i+1][3*j+1]=0,G[3*i+1][3*j+2]=1;
                        G[3*i+2][3*j]=1,G[3*i+2][3*j+1]=0,G[3*i+2][3*j+2]=1;
                    }break;
                    case'F':{
                        G[3*i][3*j]=1,G[3*i][3*j+1]=1,G[3*i][3*j+2]=1;
                        G[3*i+1][3*j]=0,G[3*i+1][3*j+1]=0,G[3*i+1][3*j+2]=0;
                        G[3*i+2][3*j]=1,G[3*i+2][3*j+1]=1,G[3*i+2][3*j+2]=1;
                    }break;
                    case'G':{
                        G[3*i][3*j]=1,G[3*i][3*j+1]=0,G[3*i][3*j+2]=1;
                        G[3*i+1][3*j]=0,G[3*i+1][3*j+1]=0,G[3*i+1][3*j+2]=0;
                        G[3*i+2][3*j]=1,G[3*i+2][3*j+1]=1,G[3*i+2][3*j+2]=1;
                    }break;
                    case'H':{
                        G[3*i][3*j]=1,G[3*i][3*j+1]=0,G[3*i][3*j+2]=1;
                        G[3*i+1][3*j]=0,G[3*i+1][3*j+1]=0,G[3*i+1][3*j+2]=1;
                        G[3*i+2][3*j]=1,G[3*i+2][3*j+1]=0,G[3*i+2][3*j+2]=1;
                    }break;
                    case'I':{
                        G[3*i][3*j]=1,G[3*i][3*j+1]=1,G[3*i][3*j+2]=1;
                        G[3*i+1][3*j]=0,G[3*i+1][3*j+1]=0,G[3*i+1][3*j+2]=0;
                        G[3*i+2][3*j]=1,G[3*i+2][3*j+1]=0,G[3*i+2][3*j+2]=1;
                    }break;
                    case'J':{
                        G[3*i][3*j]=1,G[3*i][3*j+1]=0,G[3*i][3*j+2]=1;
                        G[3*i+1][3*j]=1,G[3*i+1][3*j+1]=0,G[3*i+1][3*j+2]=0;
                        G[3*i+2][3*j]=1,G[3*i+2][3*j+1]=0,G[3*i+2][3*j+2]=1;
                    }break;
                    case'K':{
                        G[3*i][3*j]=1,G[3*i][3*j+1]=0,G[3*i][3*j+2]=1;
                        G[3*i+1][3*j]=0,G[3*i+1][3*j+1]=0,G[3*i+1][3*j+2]=0;
                        G[3*i+2][3*j]=1,G[3*i+2][3*j+1]=0,G[3*i+2][3*j+2]=1;
                    }break;
            }
        }

    }

    for(i=1;i<3*m;i+=3){
            for(j=1;j<3*n;j+=3){
                if(G[i][j]==0){
                    p++;
                    dfs(i,j);
                }
            }
        }

        printf("%d\n",p);
    }

    return 0;
}

你可能感兴趣的:(农场灌溉问题)