一:题目
有一个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.\n", H_all / reg_c); printf("%.2f percent of the region is under water.\n", 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\n", 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); }