描述
一农场由图所示的十一种小方块组成,蓝色线条为灌溉渠。若相邻两块的灌溉渠相连则只需一口水井灌溉。
输入
给出若干由字母表示的最大不超过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;
}