P1187 3D模型

发布时间 2024-01-01 21:34:26作者: Gary_NotFound

声明:

伤感了(我的估值啊啊啊啊啊啊啊啊


老规矩

先赞后看,养成好习惯!

首先确定思路:

  1. 定义一个answer来存储答案
  2. 每个区块为答案增加6×区块高度个面积
  3. 每次循环如果当前区块出现重合情况,减去上下重合的面
  4. 扫雷!

AC代码

#include<bits/stdc++.h>
using namespace std;
long long a[1100][1100];
int main() {
	char c;
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i++){
		for (int j = 1; j <= m; j++){
			cin >> c;
			a[i][j] = c - '0';
		}
	}
	long long answer = 0;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			answer += 6 * (a[i][j]);
			if (a[i][j] >= 2)
				answer -= (a[i][j] - 1) * 2;
			answer -= min(a[i][j], a[i - 1][j]);
			answer -= min(a[i][j], a[i + 1][j]);
			answer -= min(a[i][j], a[i][j - 1]);
			answer -= min(a[i][j], a[i][j + 1]);
		}
	}
	cout << answer;
	return 0;
}

代码详解

首先我们要注意看题(什么坑啊我踩了2次!)

样例输入中:

3 3
111
212
111

除了n,m,其余数据之间没有空格!
(所以用char)

我一开始是这么写的:

#include<bits/stdc++.h>
using namespace std;
int mp[114][114] = {0};
int main() {
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			cin >> mp[i][j];
	long long answer = 0;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			answer += 6 * (mp[i][j]);
			if (mp[i][j] >= 2)
				answer -= (mp[i][j] - 1) * 2;
			answer -= min(mp[i][j], mp[i - 1][j]);
			answer -= min(mp[i][j], mp[i + 1][j]);
			answer -= min(mp[i][j], mp[i][j - 1]);
			answer -= min(mp[i][j], mp[i][j + 1]);
		}
	}
	cout << answer;
	return 0;
}

后来注意到了输入:

#include<bits/stdc++.h>
using namespace std;
int mp[114][114] = {0};
int main() {
	char c;
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++){
			cin >> c;
			mp[i][j] = c - '0';
		}
	long long answer = 0;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			answer += 6 * (mp[i][j]);
			if (mp[i][j] >= 2)
				answer -= (mp[i][j] - 1) * 2;
			answer -= min(mp[i][j], mp[i - 1][j]);
			answer -= min(mp[i][j], mp[i + 1][j]);
			answer -= min(mp[i][j], mp[i][j - 1]);
			answer -= min(mp[i][j], mp[i][j + 1]);
		}
	}
	cout << answer;
	return 0;
}

RE了?!下了个大样例,才发现数据范围...

输入流不讲了(

注意一下这里就好:

cin >> c;
a[i][j] = c - '0';

后面的和"扫雷"基本相同:

answer -= min(a[i][j], a[i - 1][j]);
answer -= min(a[i][j], a[i + 1][j]);
answer -= min(a[i][j], a[i][j - 1]);
answer -= min(a[i][j], a[i][j + 1]);

但在这之前要进行一个特判

如果这个区块的高度大于1,说明至少有1个重合的面

上下楼之间,别想错了

if (a[i][j] >= 2)
	answer -= (a[i][j] - 1) * 2;

最后贴上记录AC

完结撒花!!!