• hdu 1198 Farm Irrigation


    Problem Description
    Benny has a spacious farm land to irrigate. The farm land is a rectangle, and is divided into a lot of samll squares. Water pipes are placed in these squares. Different square has a different type of pipe. There are 11 types of pipes, which is marked from A to K, as Figure 1 shows.


    Figure 1


    Benny has a map of his farm, which is an array of marks denoting the distribution of water pipes over the whole farm. For example, if he has a map 

    ADC
    FJK
    IHE

    then the water pipes are distributed like 


    Figure 2


    Several wellsprings are found in the center of some squares, so water can flow along the pipes from one square to another. If water flow crosses one square, the whole farm land in this square is irrigated and will have a good harvest in autumn. 

    Now Benny wants to know at least how many wellsprings should be found to have the whole farm land irrigated. Can you help him? 

    Note: In the above example, at least 3 wellsprings are needed, as those red points in Figure 2 show.
     
    Input
    There are several test cases! In each test case, the first line contains 2 integers M and N, then M lines follow. In each of these lines, there are N characters, in the range of 'A' to 'K', denoting the type of water pipe over the corresponding square. A negative M or N denotes the end of input, else you can assume 1 <= M, N <= 50.
     
    Output
    For each test case, output in one line the least number of wellsprings needed.
     
    Sample Input
    2 2
    DK
    HF
    3 3
    ADC
    FJK
    IHE
    -1 -1
     
    Sample Output
    2
    3
     
    http://acm.hdu.edu.cn/showproblem.php?pid=1198;
    简单搜索题目;
    题目思路:
    1、首先把A——F的每一个形状描述出来(可以与另一个想通的赋值为1,无法相通的赋值为0,每一个方形都有四个值up,down,left,right);
    2、判断与下一个方形是否会相通,根据相对位置,如果本身在下一个方形的上面,则判断本身的down与下一个方形的up值是不是都是1,是的话,就能相通,则标记次方形。
    其他的相对位置同理去思考,不作具体解释。。。
      1 #include <iostream>
      2 #include <stdio.h>
      3 #include <queue>
      4 #include <string.h>
      5 using namespace std;
      6 struct node
      7 {
      8     int up,down,left,right;
      9 }dd[11];
     10 
     11 int dir[][2]={{1,0},{0,1},{-1,0},{0,-1}};
     12 
     13 struct node2
     14 {
     15     int xx,yy;
     16 };
     17 
     18 int m,n;
     19 int map[55][55];
     20 bool flag[55][55];
     21 queue<node2>q;
     22 
     23 bool judge(node2 p,node2 temp,int kk)
     24 {
     25     if(kk==0)//上下;
     26     {
     27         if(dd[map[p.xx][p.yy]].down==1 && dd[map[temp.xx][temp.yy]].up==1)
     28         {
     29             return true;
     30         }
     31         else
     32         {
     33             return false;
     34         }
     35     }
     36     else if(kk==1)//左右;
     37     {
     38         if(dd[map[p.xx][p.yy]].right==1 && dd[map[temp.xx][temp.yy]].left==1)
     39         {
     40             return true;
     41         }
     42         else
     43         {
     44             return false;
     45         }
     46     }
     47     else if(kk==2)//下上;
     48     {
     49         if(dd[map[p.xx][p.yy]].up==1 && dd[map[temp.xx][temp.yy]].down==1)
     50         {
     51             return true;
     52         }
     53         else
     54         {
     55             return false;
     56         }
     57     }
     58     else   //右左;
     59     {
     60         if(dd[map[p.xx][p.yy]].left==1 && dd[map[temp.xx][temp.yy]].right==1)
     61         {
     62             return true;
     63         }
     64         else
     65         {
     66             return false;
     67         }
     68     }
     69 }
     70 
     71 bool judge2(node2 temp)
     72 {
     73     if(temp.xx<0 || temp.xx>=m || temp.yy<0 || temp.yy>=n || flag[temp.xx][temp.yy])
     74     return false;
     75     return true;
     76 }
     77 
     78 void bfs(int x,int y)
     79 {
     80     while(!q.empty())
     81     {
     82         q.pop();
     83     }
     84     node2 temp,p;
     85     int i;
     86     p.xx=x;
     87     p.yy=y;
     88     q.push(p);
     89     flag[x][y]=true;
     90     while(!q.empty())
     91     {
     92         p=q.front();
     93         q.pop();
     94         for(i=0;i<4;i++)
     95         {
     96             temp=p;
     97             temp.xx+=dir[i][0];
     98             temp.yy+=dir[i][1];
     99             if(!judge2(temp))
    100             continue;
    101             if(judge(p,temp,i))
    102             {
    103                 q.push(temp);
    104                 flag[temp.xx][temp.yy]=true;
    105             }
    106         }
    107     }
    108 
    109 }
    110 void init()
    111 {
    112     dd[0].up=1,dd[0].down=0,dd[0].left=1,dd[0].right=0;
    113     dd[1].up=1,dd[1].down=0,dd[1].left=0,dd[1].right=1;
    114     dd[2].up=0,dd[2].down=1,dd[2].left=1,dd[2].right=0;
    115     dd[3].up=0,dd[3].down=1,dd[3].left=0,dd[3].right=1;
    116     dd[4].up=1,dd[4].down=1,dd[4].left=0,dd[4].right=0;
    117     dd[5].up=0,dd[5].down=0,dd[5].left=1,dd[5].right=1;
    118     dd[6].up=1,dd[6].down=0,dd[6].left=1,dd[6].right=1;
    119     dd[7].up=1,dd[7].down=1,dd[7].left=1,dd[7].right=0;
    120     dd[8].up=0,dd[8].down=1,dd[8].left=1,dd[8].right=1;
    121     dd[9].up=1,dd[9].down=1,dd[9].left=0,dd[9].right=1;
    122     dd[10].up=1,dd[10].down=1,dd[10].left=1,dd[10].right=1;
    123     memset(flag,false,sizeof(flag));
    124 
    125 }
    126 int main()
    127 {
    128     while(~scanf("%d%d",&m,&n))
    129     {
    130         int i,j;
    131         if(m<0 || n<0)
    132         break;
    133         init();
    134         char op;
    135         for(i=0;i<m;i++)
    136         {
    137             for(j=0;j<n;j++)
    138             {
    139                 cin>>op;
    140                 map[i][j]=op-'A';
    141             }
    142         }
    143 
    144         int cnt=0;
    145 
    146         for(i=0;i<m;i++)
    147         {
    148             for(j=0;j<n;j++)
    149             {
    150                 if(!flag[i][j])
    151                 {
    152                     bfs(i,j);
    153                     cnt++;
    154                 }
    155             }
    156         }
    157         printf("%d\n",cnt);
    158 
    159     }
    160     return 0;
    161 }
    View Code
  • 相关阅读:
    巧用 Patch Connect Plus 简化 Intune 第三方更新管理
    如何应对薄弱的企业安全意识
    Jira可视化数据分析解决方案
    终端安全:保护企业的关键
    为什么需要ITIL服务目录
    防抖、节流函数封装(站在巨人的肩膀上)
    vue服务器渲染--NUXT
    函数防抖,函数节流(站在巨人的肩膀上)
    MAC地址和IP地址的区别和联系(站在巨人的肩膀上)
    ES8新特性(2017)-- async/await详细介绍与使用
  • 原文地址:https://www.cnblogs.com/ouyangduoduo/p/3077818.html
Copyright © 2020-2023  润新知