• zoj 2412 水田灌溉,求连通分支个数


    次题的关键是把稻田的中心点抽象成图中的点,两中心点有水管相连表示两点连通,这样,此题就转化成了求图的连通分支数目

    View Code
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 using namespace std;
     5 char grid[52][52];
     6 char map[52][52];
     7 int m,n;
     8 int dir[4][2] = {{-1,0},{0,1},{0,-1},{1,0}};     //    上,右,左,下
     9 //编号分别为         0,1,2,3
    10 int figure[11][5] =   //figure[i][0]存管子的数目
    11 {
    12     {2,0,2},       //A
    13     {2,0,1},      //B
    14     {2,3,2},        //C
    15     {2,1,3},        //D
    16     {2,0,3},        //E
    17     {2,2,1},        //F
    18     {3,0,2,1},    //G
    19     {3,0,3,2},     //H
    20     {3,1,2,3},     //I
    21     {3,0,1,3},    // J
    22     {4,0,1,2,3}     //K
    23 };
    24 //从(x,y)位置稻田的中心进行深度优先搜索
    25 void dfs(int x,int y)
    26 {
    27     int t1,t2,xi,yi,i,j,temp;
    28     grid[x][y] = '*'; //保证不会重复搜索
    29     t1 = map[x][y] - 'A';  //判断是哪种水管
    30     for(i = 1; i <= figure[t1][0]; i++)
    31     {
    32         temp= figure[t1][i];
    33         xi = x+dir[temp][0];
    34         yi = y+ dir[temp][1];
    35         if(xi >= m || yi >= n || xi < 0 || yi < 0)            continue;  //越界
    36         if(grid[xi][yi] == '*')    continue;   //被搜到过
    37         t2 = map[xi][yi] - 'A';
    38         for(j = 1; j <= figure[t2][0]; j++)  //判断两中心是否连通
    39         {
    40             if(temp + figure[t2][j] == 3 )
    41                 break;
    42         }
    43         if( j <= figure[t2][0])   //是break掉的,证明两中心连通
    44         {
    45             dfs(xi,yi);   
    46         }
    47     }
    48 }
    49 
    50 
    51 //该题的想法是以稻田的水管为点,如果两稻田的水管的中心点可以连通,则两稻田可共用一水源
    52 //关键是判断两稻田中心点是否是连通的,用map[i][j] 记录稻田水管的形状,用grid[i][j]表示水管中心是否
    53 //被搜索过,搜索过标记*,未被搜索过标记为@
    54 int main()
    55 {
    56 //    freopen("in.cpp","r",stdin);
    57 //    freopen("out.cpp","w",stdout);
    58     while(true)
    59     {
    60         int i,j;
    61         cin>>m>>n;
    62         if(m<0 || n < 0)
    63             break;
    64         memset(grid,'@',sizeof(grid));
    65         for(i=0; i< m; i++)
    66         {
    67             scanf("%s",map[i]);
    68         }
    69         int count = 0;
    70         for(i = 0; i< m; i++)
    71         {
    72             for( j = 0; j < n;  j++)
    73             {
    74                 if(grid[i][j] == '@')
    75                 {
    76                     dfs(i,j);
    77                     count++;
    78                 }
    79             }
    80         }
    81         cout<<count<<endl;
    82     }
    83     return 0;
    84 }
  • 相关阅读:
    WEB安全第二篇--用文件搞定服务器:任意文件上传、文件包含与任意目录文件遍历
    WEB安全第一篇--对服务器的致命一击:代码与命令注入
    python的内存管理与垃圾回收机制学习
    java反序列化漏洞的检测
    python epoll实现异步socket
    Python class的属性访问控制和内建函数重写实现高级功能以及@property
    weblogic新漏洞学习cve-2017-10271
    PHP后门的eval类和system类 函数到底有哪些区别
    JS 转整型
    .NET MVC model数据验证
  • 原文地址:https://www.cnblogs.com/allh123/p/2961807.html
Copyright © 2020-2023  润新知