农场灌溉问题(回溯)

时限:1000ms 内存限制:10000K 总时限:3000ms

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

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

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

输入样例:
2 2
DK
HF
3 3
ADC
FJK
IHE
-1 -1
输出样例:
2
3

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

#include<iostream>

using namespace std;

class BaseDate

{  

    public:

        bool geted;//存放当前的块是否被取

        char ch;//存放相应的字母

        int left,right,up,down;//存放是否有连通线

        init(bool g=false,char c=' ',int l=0,int r=0,int u=0,int d=0);//有默认构造函数

};

BaseDate::init(bool g,char c,int l,int r,int u,int d)//默认构造函数

{

      geted=g; ch=c; 

      left=l; right=r;  up=u;  down=d;

}

void readdata();

void search(int ,int);

int canplace(int row,int col,int r,int c);  

void printresult();

BaseDate Array[50][50];

int R,C;

int NUM[15];//存储15种不同的农场打井数

int kk=0;



int main()

{

    int num=0;

    readdata();

    while(R!=-1||C!=-1)

    {

        for(int i=0;i<R;i++)

           for(int j=0;j<C;j++)

              if(Array[i][j].geted==false)  

               {  search(i,j);  num++;  }

        NUM[kk++]=num;

        num=0;

        readdata();

    }

    printresult();

    return 0;

}

void printresult()

{

    for(int i=0;i<kk;i++)

         printf("%d\n",NUM[i]); 

}

void readdata()

{    cin>>R>>C;     //m表示行数,n表示列数

    for(int i=0;i<R;i++)

       for(int j=0;j<C;j++)                                                                                                                            

       {  Array[i][j].geted=false;//重复使用全局变量Array[50][50]

          Array[i][j].left=0;  Array[i][j].right=0;  Array[i][j].up=0;  Array[i][j].down=0;      

          cin>>Array[i][j].ch;    

          switch(Array[i][j].ch)

          {           case'A': Array[i][j].left=1;

                            Array[i][j].up=1;    break;

                   case'B': Array[i][j].right=1;

                            Array[i][j].up=1;    break;

                   case'C': Array[i][j].left=1;

                            Array[i][j].down=1;  break;

                   case'D': Array[i][j].right=1;

                            Array[i][j].down=1;  break;

                   case'E': Array[i][j].up=1;

                            Array[i][j].down=1;  break;

                   case'F': Array[i][j].left=1;

                            Array[i][j].right=1; break;

                   case'G': Array[i][j].left=1;

                            Array[i][j].right=1;  

                            Array[i][j].up=1;    break;

                   case'H': Array[i][j].left=1;

                            Array[i][j].up=1;  

                            Array[i][j].down=1;  break;

                   case'I': Array[i][j].left=1;

                            Array[i][j].right=1;  

                            Array[i][j].down=1;  break;

                   case'J': Array[i][j].right=1;

                            Array[i][j].up=1;  

                            Array[i][j].down=1;  break;

                   case'K': Array[i][j].left=1;

                            Array[i][j].right=1;

                            Array[i][j].up=1;  

                            Array[i][j].down=1;  break;

                   default: printf("error");

          }

       }

}

void search(int row,int col)

{

    int r,c;

    Array[row][col].geted=true;

    r=row; c=col-1;//

    if(canplace(row,col,r,c))

           search(r,c);

    r=row+1; c=col;//

    if(canplace(row,col,r,c))

          search(r,c);

    r=row; c=col+1;//

    if(canplace(row,col,r,c))

          search(r,c);

    r=row-1; c=col;//

    if(canplace(row,col,r,c))

          search(r,c);

}

int canplace(int row,int col,int r,int c)  

{

     if(r>=0 &&r<R &&c>=0 &&c<C &&Array[r][c].geted==false)

     {

         if(r==row &&c==col-1 &&Array[row][col].left==1 &&Array[r][c].right==1) //判左

                return 1;

         if(r==row+1 &&c==col &&Array[row][col].down==1 &&Array[r][c].up==1)//判下

                 return 1;

         if(r==row &&c==col+1 &&Array[row][col].right==1 &&Array[r][c].left==1)//判右

                 return 1;

         if(r==row-1 &&c==col &&Array[row][col].up==1 &&Array[r][c].down==1)//判上

                 return 1;

     }

     return 0;

}

你可能感兴趣的:(问题)