zoukankan      html  css  js  c++  java
  • HDU4414-DFS

    给一个图,寻找十字交叉的个数,十字交叉应为两个大于3的奇数交叉与正中央。图的大小很小。

    使用DFS搜八连块,之后按照规则筛选出符合条件的交叉。

    我的筛选规则有点蠢,先将点排序,再通过三段for循环判断。

      1 #include <algorithm>
      2 #include <cstring>
      3 #include <ctype.h>
      4 #include <cstdlib>
      5 #include <cstdio>
      6 #include <vector>
      7 #include <string>
      8 #include <queue>
      9 #include <stack>
     10 #include <cmath>
     11 #include <set>
     12 #include <map>
     13 
     14 using namespace std;
     15 
     16 struct Node{
     17     int x;
     18     int y;
     19     bool operator < (const struct Node &b) const 
     20     {
     21         if(x <= b.x)
     22         {
     23             if(x == b.x) return y <= b.y;
     24             else return true;
     25         }
     26         return false;
     27     }
     28 }cross[5000];
     29 
     30 int N,M,T;
     31 char G[100100];
     32 int vis[100100];
     33 int dx[] = {1,-1,0,0},dy[] = {0,0,1,-1};
     34 int P;
     35 
     36 void dfs(int u)
     37 {
     38     vis[u] = true;    
     39     cross[P].x = u%N;cross[P].y = u/N;
     40     P++;
     41     for(int i=0;i<4;i++)
     42     {
     43         int x = u%N + dx[i],y = u/N + dy[i];
     44         if(x >=0 && x < N && y >= 0 && y < N &&!vis[y*N+x] && G[y*N+x] == '#')
     45         {
     46             dfs(x+y*N);
     47         }
     48     }
     49 }
     50 
     51 int main()
     52 {
     53     while(scanf("%d ",&N) && N)
     54     {
     55         char s[100];
     56         for(int i=0;i<N;i++)
     57         {
     58             scanf("%s",s);
     59             for(int j=0;j<N;j++)
     60             {
     61                 G[i*N+j] = s[j];
     62             }
     63         }
     64 
     65         memset(vis,0,sizeof vis);
     66         int ans = 0;
     67         for(int i=0;i<N;i++)
     68         {
     69             for(int j=0;j<N;j++)
     70             {
     71                 if(G[i*N+j] != '#' || vis[i*N+j]) continue;
     72                 P = 0;
     73                 dfs(i*N+j);
     74             //    printf("P=%d
    ",P);
     75                 if(P % 2 == 0 || P < 5) continue;
     76                 else
     77                 {
     78                     //printf("check
    ");
     79                     sort(cross,cross+P);
     80                     /*
     81                     for(int i=0;i<P;i++)
     82                     {
     83                         printf("%d:(%d,%d)
    ",i,cross[i].x,cross[i].y);
     84                     }
     85                     */
     86                     int len = (P+1)/2,ok = 1,step = 0;
     87                     for(int i=0;i<(len-1)/2;i++)
     88                     {
     89                         if(cross[i].x != cross[0].x+i || cross[i].y != cross[0].y) {ok = 0;break;}
     90                     }
     91                     step += (len-1)/2;
     92                     for(int i=step;i < len+step;i++)
     93                     {
     94                         if(cross[i].y != (cross[step].y+i-step)
     95                         || cross[i].x != cross[step].x 
     96                         || cross[step].x != cross[step-1].x+1
     97                         || cross[step].y != cross[step-1].y-(len-1)/2) 
     98                         {ok = 0;break;}
     99                     }
    100                     step += len;
    101                     for(int i=step;i< step + (len-1)/2;i++)
    102                     {
    103                         if(cross[i].x != (cross[step].x+i-step) 
    104                         || cross[i].y != cross[step].y 
    105                         || cross[step].y != cross[0].y) 
    106                         {ok = 0;break;}
    107                     }
    108                     if(ok) ans++;
    109                 }
    110 
    111             }
    112         }
    113         printf("%d
    ",ans);
    114     }
    115 }
  • 相关阅读:
    教你一招Linux下文本比对方法
    Linux下find与exec的联手干大事
    Linux下Shell日期的格式,你知道几种?
    Linux下Python3.6的安装及避坑指南
    多线程中使用CompletableFuture
    ElasticSearch7.6.2中语法使用(更新中)
    ElasticSearch7.6.2使用_update_by_query语法
    ElasticSearch7.6.2使用_delete_by_query产生版本冲突问题
    filebeat7.6.2进程运行一段时间后自动退出问题解决
    把本地项目提交到gitLab
  • 原文地址:https://www.cnblogs.com/helica/p/4792857.html
Copyright © 2011-2022 走看看