zoukankan      html  css  js  c++  java
  • hdu 4414 Finding crosses

      题目链接:hdu 4414

      其实是一道简单的字符型水题,不涉及任何算法,可比赛时却没能做出来,这几天的状态都差到家了。。。

      题目大意是求有多少个满足条件的十字架,十字架的边不能有分叉路口,所以枚举每个点看是否满足条件就行,只是编码量的问题而已(感觉自己的码力不断下降了,我也不知道该怎么办好。。)

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 using namespace std;
     5 
     6 char s[52][52];
     7 int n;
     8 
     9 int check(int x, int y) {
    10     if(s[x][y] != '#')    return 0;
    11     int up = 0, down = 0, left = 0, right = 0;
    12     for(int i = x - 1; i >= 0; --i) {
    13         if(s[i][y] == '#')   ++up;
    14         else    break;
    15         if(s[i][y - 1] == '#' || s[i][y + 1] == '#')    return 1;
    16     }
    17     if(up == 0)    return 2;
    18 
    19     for(int i = x + 1; i <= n - 1; ++i) {
    20         if(s[i][y] == '#')   ++down;
    21         else    break;
    22         if(s[i][y - 1] == '#' || s[i][y + 1] == '#')    return 3;
    23     }
    24     if(down == 0)    return 4;
    25 
    26     if(up != down)   return 5;
    27 
    28     for(int j = y - 1; j >= 0; --j) {
    29         if(s[x][j] == '#')   ++left;
    30         else    break;
    31         if(s[x - 1][j] == '#' || s[x + 1][j] == '#')    return 6;
    32     }
    33     if(left == 0)    return 7;
    34 
    35     for(int j = y + 1; j <= n - 1; ++j) {
    36         if(s[x][j] == '#')   ++right;
    37         else    break;
    38         if(s[x - 1][j] == '#' || s[x + 1][j] == '#')    return 8;
    39     }
    40     if(right == 0)    return 9;
    41 
    42     if(left != right)   return 10;
    43 
    44     if(up != left)    return 11;
    45 
    46     return 12;
    47 }
    48 
    49 int main() {
    50     while(~scanf("%d",&n),n) {
    51         for(int i = 0; i < n; ++i)
    52             scanf("%s",s[i]);
    53         int cnt = 0;
    54         for(int i = 1; i < n - 1; ++i)
    55             for(int j = 1; j < n - 1; ++j)
    56                 if(check(i,j) == 12)   ++cnt;
    57         printf("%d
    ",cnt);
    58     }
    59     return 0;
    60 }

      学到了这种调试方法,每一步的 return 值都不同,这样子调试程序时就能很清楚问题是出在哪儿,在哪儿的运行和自己想的不一样。原本我把 check 函数定义为 bool 返回类型,每个不合法的都返回 0,最后那个 return 才返回 1,这样子原则上可以,但一旦出错却不知错在哪一步,所以以后记得在编码上需灵活一些,别再纠结于那些所谓的节省内存等问题了!!!

  • 相关阅读:
    CF 461B Appleman and Tree
    POJ 1821 Fence
    NOIP 2012 开车旅行
    CF 494B Obsessive String
    BZOJ2337 XOR和路径
    CF 24D Broken robot
    POJ 1952 BUY LOW, BUY LOWER
    SPOJ NAPTIME Naptime
    POJ 3585
    CF 453B Little Pony and Harmony Chest
  • 原文地址:https://www.cnblogs.com/Newdawn/p/4818381.html
Copyright © 2011-2022 走看看