农场灌溉问题

来源:互联网 发布:化学绘图软件 安卓 编辑:程序博客网 时间:2024/04/28 09:02

描述

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

这里写图片描述

输入

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

输出

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

输入样例

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

输出样例

2 3

提示

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

#include <iostream>#include <cstdio>#include <cstring>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<n;j++){                switch(A[i][j]){                    case'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;}
0 0
原创粉丝点击