zoukankan      html  css  js  c++  java
  • 算法习题---4-10洪水(UVa815)

    一:题目

    有一个n*m(1<=n,m<=30)的网格,每个格子都是边长为10米的正方形,网格四周是无限大的墙壁。
    输入每个格子的海拔高度,以及网格内雨水的总体积,输出水位的海拔高度以及有多少百分比的区域有水

    (一)样例输入

    3 3        //3行3列的网格
    25 37 45    //格子原本海拔高度
    51 12 34
    94 83 27
    10000      //要注入的水总量
    0 0       //表示结束输入

    (二)样例输出

    Region 1
    Water level is 46.67 meters.
    66.67 percent of the region is under water.

    二:代码实现

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    #include <string>
    
    #define M 30
    #define N 30
    
    float Area_M[M][N];
    float Area_W[M][N];
    int m, n;
    float c;

    获取水平高度等信息

    void getWaterHighInfo()
    {
        int reg_c;
        float w_min,H_all = 0.0;
    
        while (c>0)
        {
            w_min = Area_M[0][0] + Area_W[0][0],reg_c = 0;    //设置最小水平初始值
    
            //先找到最小水平面值
            for (int i = 0; i < m; i++)
                for (int j = 0; j < n; j++)
                    if (w_min>Area_M[i][j] + Area_W[i][j])
                        w_min = Area_M[i][j] + Area_W[i][j];
    
            //向其中放水
            for (int i = 0; i < m; i++)
            {
                for (int j = 0; j < n; j++)
                    if (Area_M[i][j] + Area_W[i][j] == w_min)
                    {
                        Area_W[i][j] += 0.01;
                        reg_c++;
                    }
            }
            c -= 0.01 * 10 * 10*reg_c;    //减去相应水量
        }
        //打印水平高度
        //先找到一个有水的方格
        reg_c = 0;
        for (int i = 0; i < m; i++)
        {
            for (int j = 0; j < n; j++)
                if (Area_W[i][j] != 0)
                {
                    reg_c++;
                    H_all += Area_W[i][j]+Area_M[i][j];  //因为float含有误差,我们单独输出一个数据可能有误差,所以我们将所有数据获取,取平均值来减少误差
                }
        }
    
        //打印百分比
        printf("Water level is %.2f meters.
    ", H_all / reg_c);
        printf("%.2f percent of the region is under water.
    ", reg_c*100.0 / (m*n));
    }

    主函数:包含获取输入信息

    void main()
    {
        FILE* fp = freopen("data10.in", "r", stdin);
        freopen("data10.out", "w", stdout);
        int count = 1;
        while (!feof(fp))
        {
            scanf("%d %d", &m, &n);
            getchar();
            if (m == 0)
                break;
            printf("Region %d
    ", count++);
            //获取山体高度
            for (int i = 0; i < m; i++)
            {
                for (int j = 0; j < n; j++)
                    scanf("%f", &Area_M[i][j]);
                getchar();
            }
            scanf("%f", &c);
            getchar();
            memset(Area_W, 0, sizeof(Area_W));
            getWaterHighInfo();
        }
    
        freopen("CON", "r", stdin);
        freopen("CON", "w", stdout);
    }
  • 相关阅读:
    20191218《信息安全导论》第十二周总结
    20191218《信息安全导论》第十一周总结
    20191218《信息安全导论》第十周总结
    20191218《信息安全导论》第九周总结
    20191218《信息安全导论》第八周总结
    20191218《信息安全导论》第七周总结
    20191218《信息安全导论》第六周总结
    20191218《信息安全导论》寻找我的黑客偶像
    20191218《信息安全导论》第五周总结
    20191211_获奖感言及学习心得
  • 原文地址:https://www.cnblogs.com/ssyfj/p/11175553.html
Copyright © 2011-2022 走看看