📄 farm.cpp
字号:
#include <stdio.h>
#include <iostream.h>
/*一农场由图所示的十一种小方块组成,蓝色线条为灌溉渠。若相邻两块的灌溉渠相连则只需一口水井灌溉。
给出若干由字母表示的最大不超过50×50具体由(m,n)表示,
的农场图,编程求出最小需要打的井数。每个测例的输出占一行。当M=N=-1时结束程序。
*/
typedef struct node
{
int up;
int right;
int left;
int down;
int color;
}node;
node a[50][50];
int row,col;
int currentnum=0;//用于记录当前输入
int testnum=0;//用于记录第几组数据
int farm;
void readdata(){//读入数据,对11种情况的初始化工作
currentnum=0;
char k;
for(int i=0;i<row;i++)
for(int j=0;j<col;j++){
cin>>k;
switch (k)
{
case 'A':
a[i][j].up=1;
a[i][j].right=0;
a[i][j].down=0;
a[i][j].left=1;
a[i][j].color=0;
break;
case 'B':
a[i][j].up=1;
a[i][j].right=1;
a[i][j].down=0;
a[i][j].left=0;
a[i][j].color=0;
break;
case 'C':
a[i][j].up=0;
a[i][j].right=0;
a[i][j].down=1;
a[i][j].left=1;
a[i][j].color=0;
break;
case 'D':
a[i][j].up=0;
a[i][j].right=1;
a[i][j].down=1;
a[i][j].left=0;
a[i][j].color=0;
break;
case 'E':
a[i][j].up=1;
a[i][j].right=0;
a[i][j].down=1;
a[i][j].left=0;
a[i][j].color=0;
break;
case 'F':
a[i][j].up=0;
a[i][j].right=1;
a[i][j].down=0;
a[i][j].left=1;
a[i][j].color=0;
break;
case 'G':
a[i][j].up=1;
a[i][j].right=1;
a[i][j].down=0;
a[i][j].left=1;
a[i][j].color=0;
break;
case 'H':
a[i][j].up=1;
a[i][j].right=0;
a[i][j].down=1;
a[i][j].left=1;
a[i][j].color=0;
break;
case 'I':
a[i][j].up=0;
a[i][j].right=1;
a[i][j].down=1;
a[i][j].left=1;
a[i][j].color=0;
break;
case 'J':
a[i][j].up=1;
a[i][j].right=1;
a[i][j].down=1;
a[i][j].left=0;
a[i][j].color=0;
break;
case 'K':
a[i][j].up=1;
a[i][j].right=1;
a[i][j].down=1;
a[i][j].left=1;
a[i][j].color=0;
break;
}
}
}
void search(int m,int n){
a[m][n].color=currentnum;
if(a[m-1][n].color==0&&m>0&&a[m][n].up==1&&a[m-1][n].down==1)//向上
search(m-1,n);
if(a[m][n+1].color==0&&n<col&&a[m][n].right==1&&a[m][n+1].left==1)//向右
search(m,n+1);
if(a[m+1][n].color==0&&m<row&&a[m][n].down==1&&a[m+1][n].up==1)//向下
search(m+1,n);
if(a[m][n-1].color==0&&n>0&&a[m][n].left==1&&a[m][n-1].right==1)//向左
search(m,n-1);
}
void printresult(){
/* printf("\n");
for(int i=0;i<row;i++){
for(int j=0;j<col;j++)
printf("%d ",a[i][j].color);
printf("\n");}
*/
printf("%d\n",currentnum);
}
void main(){
cin>>row;
cin>>col;
while(row!=-1||col!=-1){
readdata();
for(int i=0;i<row;i++)
for(int j=0;j<col;j++)
if(a[i][j].color==0){
currentnum++;
search(i,j);
}
printresult();
cin>>row;
cin>>col;
}
}
/*
3 3
3 3
A D C
F J K
I H E
2 2
D K
H F
3 3
A D C
F J K
I H E
2 2
D K
H F
3 3
A A C
F J K
I H E
-1 -1
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -