一:题目
有一个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);
}