zoukankan      html  css  js  c++  java
  • Place the Robots 需要较强的建图能力

                      Place the Robots

    思路:在任意一个点格子放机器人,那么它所在的行和列被控制了。我们对每一行或每一列连续的空地(草地忽视)称之为块,给每一行和每一列的块标号,

    每一行的快与每一列的快相交的话,才有只有一个交点。  我们把交点当边,把行块和列块连接起来。每一个空第都是一条边。详细细节见代码。

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstring>
      4 #include <cmath>
      5 #include <algorithm>
      6 #include <string>
      7 #include <vector>
      8 #include <set>
      9 #include <map>
     10 #include <stack>
     11 #include <queue>
     12 #include <sstream>
     13 #include <iomanip>
     14 using namespace std;
     15 typedef long long LL;
     16 const int INF = 0x4fffffff;
     17 const double EXP = 1e-5;
     18 const int MS = 55;
     19 const int SIZE = 100005;
     20 
     21 // data struct
     22 char pic[MS][MS];
     23 int sx[MS][MS];
     24 int sy[MS][MS];
     25 
     26 int x[MS*MS];
     27 int y[MS*MS];
     28 
     29 int cx[MS*MS];
     30 int cy[MS*MS];
     31 
     32 bool edges[MS*MS][MS*MS];
     33 int mark[MS*MS];
     34 int nx,ny,kase;
     35 int n,m;
     36 
     37 int path(int u)
     38 {
     39       for(int v=1;v<=ny;v++)
     40       {
     41             if(edges[u][v]&&!mark[v])
     42             {
     43                   mark[v]=1;
     44                   if(cy[v]==0||path(cy[v]))
     45                   {
     46                         cx[u]=v;
     47                         cy[v]=u;
     48                         return 1;
     49                   }
     50             }
     51       }
     52       return 0;
     53 }
     54 
     55 void match()
     56 {
     57       memset(cx,0,sizeof(cx));
     58       memset(cy,0,sizeof(cy));
     59       int ans=0;
     60       for(int u=1;u<=nx;u++)
     61       {
     62             if(!cx[u])
     63             {
     64                   memset(mark,0,sizeof(mark));
     65                   ans+=path(u);
     66             }
     67       }
     68       printf("Case :%d
    %d
    ",kase++,ans);
     69 }
     70 
     71 int main()
     72 {
     73       kase=1;
     74       int T;
     75       scanf("%d",&T);
     76       while(T--)
     77       {
     78             scanf("%d%d",&n,&m);
     79             for(int i=0;i<n;i++)
     80                   scanf("%s",pic[i]);
     81             memset(sx,0,sizeof(sx));
     82             memset(sy,0,sizeof(sy));
     83             int num=0,flag;
     84             for(int i=0;i<n;i++)
     85            {
     86                  flag=0;
     87                   for(int j=0;j<m;j++)
     88                   {
     89                         if(pic[i][j]=='o')
     90                         {
     91                               if(flag==0)
     92                               {
     93                                     num++;
     94                                     flag=1;
     95                               }
     96                               sx[i][j]=num;
     97                         }
     98                         else if(pic[i][j]=='#')
     99                               flag=0;
    100                   }
    101            }
    102             nx=num;
    103             num=0;
    104             for(int j=0;j<m;j++)
    105             {
    106                   flag=0;
    107                   for(int i=0;i<n;i++)
    108                   {
    109                         if(pic[i][j]=='o')
    110                         {
    111                               if(flag==0)
    112                               {
    113                                     num++;
    114                                     flag=1;
    115                               }
    116                               sy[i][j]=num;
    117                         }
    118                         else if(pic[i][j]=='#')
    119                               flag=0;
    120                   }
    121             }
    122             ny=num;
    123             memset(edges,0,sizeof(edges));
    124             for(int i=0;i<n;i++)
    125                   for(int j=0;j<m;j++)
    126             {
    127                   if(pic[i][j]=='o')
    128                         edges[sx[i][j]][sy[i][j]]=1;
    129             }
    130             match();
    131       }
    132       return 0;
    133 }
  • 相关阅读:
    host配置
    查看浏览器内核以及版本信息
    优化你的数据库索引
    密集索引和稀疏索引的区别
    Interview
    hadoop启动后,jps命令后发现nodename启动失败,检查日志报错:FSNamesystem initialization failed
    hadoop学习之hadoop完全分布式集群安装
    VMWare虚拟机下为Ubuntu 配置静态IP(NAT方式)ping通主机
    虚拟机突然无法使用NAT模式上网
    hadoop-0.20.2 & hbase-0.90.1 集群启动错误“org.apache.hadoop.ipc.RPC$VersionMismatch: Protocol org.apache.hadoop.hdfs.protocol.ClientP
  • 原文地址:https://www.cnblogs.com/767355675hutaishi/p/4436106.html
Copyright © 2011-2022 走看看