ACDREAM 02B 瑶瑶带你玩激光坦克(暴力专场)

ACDREAM 02B 瑶瑶带你玩激光坦克

Problem Description

有一款名为激光坦克的游戏,游戏规则是用一个坦克发出激光来达到一些目的,激光可以通过一些镜子反射。

机智的瑶瑶为了显示自己的智商高于常人,把这个游戏改造了一下,变成了用激光攻击敌人的游戏。

瑶瑶想知道射一次激光最多可以攻击到多少个敌人。

PS: 由于激光很强大,可以在击中敌人后穿过它,而瑶瑶自己的坦克由于有特殊装置,所以不会被激光击中,激光也会直接穿过它
Input

第1行两个正整数n, m (1 ≤ n, m ≤ 1000)表示地图大小,接下来n行每行m个字符描述地图。

. 表示此处为空地

  • 表示此处为障碍(激光不可穿过,激光路径打到障碍时就结束)

T 代表瑶瑶的坦克位置

E 代表敌人

/ 代表按 左下-右上 放置的镜子

\ 代表按 左上-右下 放置的镜子
Output

一个整数代表瑶瑶向某个方向发射激光后最多可以攻击到的敌人数。
Sample Input

5 5
.*/E\
E*.*.
E*TEE
…/
.*\EE

Sample Output

4

解题思路:从T点开始往四个方向模拟一边。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#define N 1005
using namespace std;
typedef long long ll;
int n, m, Max;
int dir[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
char map[N][N];
int vis[N][N][4], visE[N][N];
void DFS(int x, int y, int d) {
    int px = x, py = y, e = 0, di = d;
    while (1) {
        if (map[px][py] == '*') break;
        if (vis[px][py][di]) break;
        vis[px][py][di] = 1;
        if (px < 0 || py < 0) break;
        if (px >= n || py >= m) break;
        if (map[px][py] == 'E' && !visE[px][py]) {
            visE[px][py] = 1;
            e++;
        } 
        if (map[px][py] == '\\') {
            if (di == 0) di = 2;
            else if (di == 1) di = 3;
            else if (di == 2) di = 0;
            else if (di == 3) di = 1;
        } else if (map[px][py] == '/') {
            if (di == 0) di = 3;
            else if (di == 1) di = 2;
            else if (di == 2) di = 1;
            else if (di == 3) di = 0;
        }
        px += dir[di][0], py += dir[di][1];
        //      printf("{%d %d, %d}%c\n", px, py, di, map[px][py]);

    }
    Max = max(Max, e);
} 
int main() {
    while (scanf("%d %d\n", &n, &m) == 2) {
        int bx, by;
        Max = 0;
        for (int i = 0; i < n; i++) {
            scanf("%s", map[i]);
            for (int j = 0; j < m; j++) {
                if (map[i][j] == 'T') {
                    bx = i, by = j;
                }
            }
        }
        for (int i = 0; i < 4; i++) {
            memset(vis, 0, sizeof(vis));
            memset(visE, 0, sizeof(visE));
            DFS(bx, by, i);
        }
        printf("%d\n", Max);
    }   
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值