?? 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 + -