QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#873794 | #3251. 数正方体 | ylch | RE | 0ms | 0kb | C++14 | 2.9kb | 2025-01-26 23:12:32 | 2025-01-26 23:12:34 |
answer
/*
“学霸题,数正方体,头顶标数法……” 欸,这道题我们就用头顶标数法来做(貌似样例解释也是这么给的)
由于保证了没有顶面遮挡,所以我们只要找到每一竖列的头顶,就能知道这一列有多少正方体
考虑如何标数,我们可以考虑从底开始沿着每一条右侧棱|往上走(从左走会无法分辨转折点的边缘线),
如果走到+号就说明到达了一个顶面,给这个顶面记录经过的长方体个数,就是要累加的答案
然后再往后两格,跳过这个顶面(走斜线),继续向上找。直到到最顶就标完了这一列所有的数
具体可参见代码。
还有一个小细节:因为cin不能读入空格,所以要用getchar()。为了避免读入行尾换行,考虑多用一个getchar()过滤掉即可
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int r, c, ans; // ans记录答案
char a[100][100];
signed main()
{
cin >> r >> c; getchar(); // 吃掉换行
for(int i = 1; i <= r; i ++){
for(int j = 1; j <= c; j ++){
a[i][j] = getchar();
}
getchar(); // 吃掉换行
}
// 找到底面第一个+的位置。因为我们沿右侧棱走,所以跳过第一个左侧棱
int p = 1;
while(a[r][p] != '+') p ++;
p ++; // 躲过第一个加号
// 循环遍历底面的每一个+
for(int j = p; j <= r; j ++){
if(a[r][j] == '+'){ // 从这里开始往上遍历
int x = r - 1, y = j; // 赋值为r-1,躲掉+号,避免多算答案
int layer = 0; // 层数的计数器
while(x >= 1 && y <= c){
// cout << x << ' ' << y << ' ' << ans << endl;
if(a[x][y] == ' '){ // 说明走过头了(现在在顶面中间的空格),要先退回来一点
x ++; // 向下退一格
x --, y ++; // 向右上方走一格,表示要开始走顶棱了
while(x >= 1 && y <= c){
// cout << x << ' ' << y << ' ' << ans << endl;
if(a[x][y] == '+') ans += layer; // 说明一个顶面走完了,累加这个面的答案
if(a[x-1][y] == '|'){ // 说明这一层平着遍历已经结束,应该遍历下一层了。
x --; // 往上走一格,躲掉+号,避免多算答案
break; // 这一层平着走的任务结束了
}
x --, y ++; // 继续向右上方走
}
}
else{
if(a[x][y] == '+') layer ++; // 说明又上了一层
x --; // 继续向上走
}
}
}
}
cout << ans << '\n';
return 0;
}
/*
19 19
......+---+........
...../ /|........
....+---+ |........
....| | +---+....
....| |/ /|....
....+---+---+ |....
.../ /| | +---+
..+---+ | |/ /|
..| | +---+---+ |
..| |/ / /| +
..+---+---+---+ |/|
./ / /| | + |
+---+---+ | |/| +
| | | +---+ |/.
| | |/ /| +..
+---+---+---+ |/...
| | | | +....
| | | |/.....
+---+---+---+......
输出:21
*/
详细
Test #1:
score: 0
Runtime Error
input:
371 259 ......................................................................+---+---+.................................................................................................................................................................................... ...................................