您的位置:首页 > 其它

农场灌溉问题

2016-05-15 01:24 281 查看
描述

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



输入

给出若干由字母表示的最大不超过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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: