• 算法习题---4-2正方形(UVa201)


    一:题目

    判断一个点阵中含有几个正方形(数正方形)

    如图例中:有2个边长为1的正方形,1个边长为2的正方形

    (一)题目详解

    (二)样例输入

    4       表示每行每列各有4个顶点
    16       表示整个点阵中共有16条边
    H 1 1    H表示水平边 从(1,1)->(1,2)之间有一条边  注意:1 1 表示水平第一行第一个顶点
    H 1 3
    H 2 1
    H 2 2
    H 2 3
    H 3 2
    H 4 2
    H 4 3
    V 1 1    V表示垂直边 从(1,1)->(2,1)之间有一条边 注意:1 1 表示垂直看第一列第一个顶点
    V 2 1
    V 2 2
    V 2 3
    V 3 2
    V 4 1
    V 4 2
    V 4 3

    2
    3
    H 1 1
    H 2 1
    V 2 1

     

    二:代码实现

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define N 9
    int n,m;
    int edge[N*N][3];    //边信息
    int square[N+1][N+1];    //正方形顶点信息,从(1,1)开始

    获取边信息edge,并转换为一个二维数组square保存顶点信息《重点》

    void getInfo()
    {
        //获取顶点、边数
        scanf("%d", &n);
        scanf("%d", &m);
    
        //将边信息转换为正方形信息
        memset(square, sizeof(square), 0);
    
        //获取边信息
        for (int i = 0; i < m; i++)
        {
            getchar();
            scanf("%c %d %d", (char*)&edge[i][0], &edge[i][1], &edge[i][2]);
            //注意1表示水平有边,2表示垂直有边,既有水平,又有垂直为3
            //注意V的时候 V 2 1 是代表第二列第一个
            edge[i][0] == 'H' ? square[edge[i][1]][edge[i][2]] += 1 : square[edge[i][2]][edge[i][1]] += 2;
        }
    }

    获取指定边数的正方形个数

    int getNumForSq(int ec)
    {
        //从正方形左上角开始从上到下,从左到右
        int num = 0,x,y;
        for (int i = 1; i <= n - ec;i++)    //
        {
            for (int j = 1; j <= n - ec;j++)    //
            {
                if (square[j][i]!=0)    //此处有顶点
                {
                    //开始判断是否有指定大小正方形
                    x = j, y = i;
                    //判断上横边
                    for (y = i; y <= i + ec-1; y++)
                        if (!(square[x][y] == 1 || square[x][y] == 3))
                            goto Next;
    
                    //判断下横边
    
                    x = j + ec, y = i;
                    for (y = i; y <= i + ec-1; y++)
                        if (!(square[x][y] == 1 || square[x][y] == 3))
                            goto Next;
    
                    //判断左边
                    x = j, y = i;
                    for (x = j; x <= j + ec-1;x++)
                        if (!(square[x][y] == 2 || square[x][y] == 3))
                            goto Next;
    
                    //判断右边
                    x = j, y = i + ec;
                    for (x = j; x <= j + ec-1; x++)
                        if (!(square[x][y] == 2 || square[x][y] == 3))
                            goto Next;
    
                    //构成正方形
                    num++;
                }
    
            Next:;
            }
        }
    
        return num;
    }

    主函数

    int main()
    {
        FILE* fp=freopen("data2.in", "r", stdin);
        freopen("data2.out", "w", stdout);
        int i = 1, j,num,flag;
    
        while (!feof(fp))
        {
            //获取一组信息
            flag = 0;
            getInfo();
            printf("Problem #%d
    
    ", i++);
            
            //开始进行计算正方形大小 从1->n-1
            for (j = 1; j < n;j++)
            {
                num = getNumForSq(j);
                if (num)
                {
                    printf("%d square(s) of size %d
    ", num, j); 
                    flag = 1;
                }
            }
    
            flag ? printf("
    **************************
    
    ") : printf("No completed squares can be found.
    ");
        }
    
        freopen("CON", "r", stdin);
        freopen("CON", "w", stdout);
    
        return 0;
    }

    结果输出

  • 相关阅读:
    设计带构造函数的Dog类 代码参考
    动态生成Person类的对象 代码参考
    Fragment传值
    Fragment的创建
    显示Intent和隐式Intent
    Intent及其七大属性及intent-filter设置
    Activity传值的几种方式
    认识Activity
    GridView的基本使用
    Spinner的基本使用
  • 原文地址:https://www.cnblogs.com/ssyfj/p/11139268.html
Copyright © 2020-2023  润新知