声明:
伤感了(我的估值啊啊啊啊啊啊啊啊
老规矩
先赞后看,养成好习惯!
首先确定思路:
- 定义一个answer来存储答案
- 每个区块为答案增加6×区块高度个面积
- 每次循环如果当前区块出现重合情况,减去上下重合的面
- 扫雷!
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