边遍历边统计妙用

链接:https://ac.nowcoder.com/acm/contest/80259/B
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

小红来到了地下城的一个房间,房间被分成 n 行 m 列的格子,小红站在其中一个格子上,她可以向一个方向攻击整条直线的所有格子(小红不能改变自己的位置和朝向)。
小红想知道,自己可以攻击到多少只怪物?

输入描述:

第一行输入两个正整数n,m,代表矩阵的行数和列数。
接下来的 n 行,每行输入一个字符串,代表矩阵。字符串仅由 ‘ . ’、' * ' 和大写字母组成。其中 ' . ' 代表空地,' * ' 代表该格子上有一只怪物。大写字母有且仅有一个,且为 ' W '、' S '、' A '、' D ' 中的一种,代表小红面朝的方向。' W' 代表向上,' S ' 代表向下,' A ' 代表向左,' D ' 代表向右。
1 ≤ n, m ≤ 1000

输出描述:

小红可以攻击到的怪物数量。

输入

4 5
..***
.****
**.**
*.*A*

输出

2

说明

小红向左攻击,可以攻击到两个怪物。












解答

#include <iostream>
using namespace std;
const int N = 1010;

// cnt1 统计当前点左边的数
// cnt2 统计当前点上边的数
// cnt1[i]++ 也就是当前点横坐标加加,也就统计出横轴的数
// cnt2[j]++ 也就是当前点纵坐标加加,也就统计出纵轴的数
int cnt1[N], cnt2[N];
int ans;

int main()
{
	int n, m;
	char c;
	cin >> n >> m;

	int f1 = -1;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
		{
			cin >> c;
			if (c == '*') cnt1[i]++, cnt2[j]++;
			if (c == 'A') ans = cnt1[i];
			if (c == 'D') ans = i, f1 = 1, cnt1[i] = 0;
			if (c == 'W') ans = cnt2[j];
			if (c == 'S') ans = j, f1 = 2, cnt2[j] = 0;
		}

	if (f1 == -1) cout << ans << endl;
	if (f1 == 1) cout << cnt1[ans] << endl;
	if (f1 == 2) cout << cnt2[ans] << endl;
}
posted @   星竹z  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示