• 农场灌溉问题(回溯)


    时限: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;
    }
  • 相关阅读:
    小明系列问题——小明序列
    Multiplication Table
    DZY Loves Colors
    Points
    Tree
    img标签中alt属性与title属性在seo的作用-摘自网友
    如何合理命名CSS文件——摘自网友
    <meta http-equiv="X-UA-Compatible" content="IE=7" />
    英语
    10个CSS简写/优化技巧-摘自网友
  • 原文地址:https://www.cnblogs.com/IThaitian/p/2595695.html
Copyright © 2020-2023  润新知