习题4-2 Squares UVA - 201

这道题我没做出来,主要是因为数据结构没想出来。我想的是用一整个图来存这个正方形,以及那些点的相互连接情况。但是想出来的结构都太繁琐了,而且错误率很高。最后在网上看了一个大佬的解法,很受启发,就写出来了。

他的解法没全存,而是分开横行和竖行存,两个一维数组,第i个元素表示是否i和i+1号元素相连接,相连就是1,不相连就是0。这样简单了很多,只需要遍历每个点,对每个点,再遍历所有的边长,就行了。其实和我想的算法几乎一样,只是我没想明白数据如何存储,但是他想明白了。

除了数据结构之外,这道题还卡我一个点,调了几十分钟bug:输入格式有两种,输入i行j列,和输入i列j行

#include <bits/stdc++.h>
#define N 15
using namespace std;
int h[N][N],v[N][N];
int main()  {
    int n,m,T=0,t1,t2;
    char c;
    while (scanf("%d%d",&n,&m)!=EOF)    {
        fill(h[0],h[0]+N*N,0);
        fill(v[0],v[0]+N*N,0);
        int flag=0;
        getchar();
        for (int i=0;i<m;i++)   {
            scanf("%c%d%d",&c,&t1,&t2);
            getchar();
            if (c=='H') h[t1][t2]=1;
            else if (c=='V')    v[t2][t1]=1;
        }
        if (T++)    printf("\n**********************************\n\n");
        printf("Problem #%d\n\n",T);
        for (int len=1;len<=n;len++)    {
            int sum=0;
            for (int i=1;i+len<=n;i++)   {
                for (int j=1;j+len<=n;j++)  {
                    int cnt=1;
                    for (int k=0;k<len;k++)    {
                        if (!h[i][j+k]||!h[i+len][j+k]) {cnt=0;break;}
                        if (!v[i+k][j]||!v[i+k][j+len]) {cnt=0;break;}
                    }
                    sum+=cnt;
                }
            }
            if (sum)    {
                flag=1;
                printf("%d square (s) of size %d\n",sum,len);
            }
        }
        if (!flag)  printf("No completed squares can be found.\n");
    }
    return 0;
}
posted @ 2018-09-22 16:38  CF过2100就买ARCTERYX  阅读(137)  评论(0编辑  收藏  举报