算法竞赛入门经典 第二版 习题4-2 正方形 Squares uva201

题目https://vjudge.net/problem/UVA-201
第四章里做出来的第一道习题(┬_┬)
除了一遍莫名其妙的编译错误外直接AC了
相较错了22遍暂时放弃的习题4-1 象棋uva1589真是顺利多了

思路:定义了结构体标明第i行,第j列的点紧跟着的横线、竖线是否有,然后枚举每个点分别判断是否存在边长从1至可能的最大值的正方形然后统计。

反思:读题,读题,好好读题
V i j indicates a vertical line in column i which connects
the dot in row j to the one below in row j + 1
这句话我愣是想当然的还以为i始终表示行号,j始终表示列号,仔细琢磨了一下样例输入才反应过来。。。

至于其他坑注意一下格式就没啥问题了

附上AC代码:c语言

#include 
#include 
#include 
#include 
#include 
typedef struct
{
    int h, v;
}point;
point a[20][20];
int b[20];
int min(int x, int y)
{
    return xvoid getline()
{
    char c;
    int i, x, y, n;
    scanf("%d", &n);
    for(i=0;iscanf("%*c%c", &c);
        if(c=='H')
        {
            scanf("%d%d", &x, &y);
            a[x][y].h = 1;
        }
        else if(c=='V')
        {
            scanf("%d%d", &x, &y);
            a[y][x].v = 1;
        }
    }
}
int judge(int x, int y, int sz)
{
    int i;
    for(i=0; iif(a[x][y+i].h==0||a[x+sz][y+i].h==0)
        {
            return 0;
        }
    }
    for(i=0; iif(a[x+i][y].v==0||a[x+i][y+sz].v==0)
        {
            return 0;
        }
    }
    return 1;
}
void print()
{
    int i,t=0;
    for(i=1; i<=8; i++)
    {
        if(b[i]!=0)
        {
            t = 1;
            printf("%d square (s) of size %d\n", b[i], i);
        }
    }
    if(t==0)
    {
        printf("No completed squares can be found.\n");
    }
}
int main()
{
    int cases=0, i, j, k, n, num;
    while(scanf("%d", &n)!=EOF)
    {
        cases++;
        if(cases!=1)
        {
            printf("\n**********************************\n\n");
        }
        memset(a,0,sizeof(a));
        getline();
        memset(b,0,sizeof(b));
        for(i=1; i<=n-1; i++)
        {
            for(j=1; j<=n-1; j++)
            {
                for(k=1; k<=min(n-i, n-j); k++)
                {
                    if(judge(i, j, k))
                    {
                        b[k]++;
                    }
                }
            }
        }
        printf("Problem #%d\n\n",cases);
        print();
    }
    return 0;
}

你可能感兴趣的:(解题笔记)