QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#873794#3251. 数正方体ylchRE 0ms0kbC++142.9kb2025-01-26 23:12:322025-01-26 23:12:34

Judging History

你现在查看的是最新测评结果

  • [2025-01-26 23:12:34]
  • 评测
  • 测评结果:RE
  • 用时:0ms
  • 内存:0kb
  • [2025-01-26 23:12:32]
  • 提交

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
......................................................................+---+---+....................................................................................................................................................................................
...................................

output:


result: