• 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,这样子原则上可以,但一旦出错却不知错在哪一步,所以以后记得在编码上需灵活一些,别再纠结于那些所谓的节省内存等问题了!!!

  • 相关阅读:
    PostgreSQL几种启动方式测试
    PwoerDesigner 生成数据库时没有中文注释
    Temporary ASP.NET Files没有权限
    Asp.net mvc 存Datetime 取Date
    部署asp.net mvc(Identity)
    01 简单工厂模式
    Asp.net 下拉列表框
    Asp.net 验证码
    底层网络知识详解-最重要的传输层4-套接字socket
    底层网络知识详解-最重要的传输层3-TCP协议下
  • 原文地址:https://www.cnblogs.com/Newdawn/p/4818381.html
Copyright © 2020-2023  润新知