B - 瑶瑶带你玩激光坦克

B - 瑶瑶带你玩激光坦克

Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 256000/128000KB (Java/Others)

Submit Status

Problem Description

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

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

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

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

Input

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

表示此处为空地

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

代表瑶瑶的坦克位置

代表敌人

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

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

Output

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

Sample Input

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

Sample Output

4

Hint

感谢Picknight同学发现第三组数据问题!数据已更正

题意:

T为坦克的坐标,坦克向上下左右四个方向发射激光,激光能够穿过敌人E,遇到*结束,在地图的外围用*弄了的围墙,遇到/或者\发射,  .表示空地,E表示敌人,问最多能够打死多少个敌人。

思路:用Map获取地图,Map_S作为标记数组,标记方式不能够赋值,而是Map_S[][]++;一个点最多经过2次,所以,判断当前的点是否已经被标记过2次,就能够判断是否死循环。还有这题的话,用递归容易RE,别问我为什么,我也不知道、、、改了好几次也还是RE、

这个是RE的代码。。。

#include <algorithm>
#include <iostream>
#include <stdio.h>
#include <string.h>
#define max(a,b)a>b?a:b
#pragma comment(linker,"/STACK:102400000,102400000")
using namespace std;
char Map[1010][1010];
int Map_S[1010][1010];
int Begin_X,Begin_Y;
int SUM;
int sum;
void BFS(int x,int y,int N)
{
    if(Map[x][y]==‘*‘)return;
    if(Map_S[x][y]>=5)return;
    Map_S[x][y]++;
    if(Map[x][y]==‘/‘)
    {
        if(N==0)BFS(x,y-1,3);
        if(N==1)BFS(x,y+1,2);
        if(N==2)BFS(x-1,y,1);
        if(N==3)BFS(x+1,y,0);
    }
    if(Map[x][y]==‘\\‘)
    {
        if(N==0)BFS(x,y+1,2);
        if(N==1)BFS(x,y-1,3);
        if(N==2)BFS(x+1,y,0);
        if(N==3)BFS(x-1,y,1);
    }
    if(Map[x][y]==‘.‘||Map[x][y]==‘T‘||Map[x][y]==‘E‘)
    {
        if(Map[x][y]==‘E‘&&Map_S[x][y]==1)sum++;
        if(N==0)BFS(x+1,y,N);
        if(N==1)BFS(x-1,y,N);
        if(N==2)BFS(x,y+1,N);
        if(N==3)BFS(x,y-1,N);
    }
    Map_S[x][y]--;
    return ;
}
/*
void Put(int N,int M)
{
    for(int i=0;i<=N+1;i++)
    {
        for(int j=0;j<=M+1;j++)
        {
            putchar(Map[i][j]);
        }putchar(10);
    }
}
*/
int main()
{
    int N,M,i,j;
    char str;
    while(scanf("%d%d",&N,&M)!=EOF)
    {
        for(i=1;i<=N;i++)scanf(" %s",Map[i]+1);
        for(i=0;i<=N+1;i++)
        {
            for(j=0;j<=M+1;j++)
            {
                Map_S[i][j]=0;
                if(i==0||j==0||i==N+1||j==M+1){Map[i][j]=‘*‘;continue;}
                if(Map[i][j]==‘T‘)
                {
                        Map[i][j]=‘.‘;
                        Begin_X=i;
                        Begin_Y=j;
                }
            }
        }
      /*  Put(N,M);*/
        SUM=0;
        for(i=0;i<4;i++)
        {
            sum=0;
            BFS(Begin_X,Begin_Y,i);
            SUM=max(SUM,sum);
        }
        printf("%d\n",SUM);

    }
    return 0;
}
/*
3 3
/EEET
\E/

3 3
/...T
\./

3 4
//E/TE/
\/E/

3 2
/ET
\/

*/

这个是AC的代码。。。

  1 #include <algorithm>
  2 #include <iostream>
  3 #include <stdio.h>
  4 #include <string.h>
  5 #define max(a,b)a>b?a:b
  6 using namespace std;
  7 char Map[1010][1010];
  8 int Map_S[1010][1010];
  9 int Work(int x,int y,int Go_To)/*x,y,为坐标,Go_To为方向*/
 10 {
 11     memset(Map_S,0,sizeof(Map_S));
 12     int sum=0;
 13     while(1)
 14     {
 15         if(Map[x][y]==‘*‘)return sum;   /*如果为墙的话,就退出*/
 16         if(Map_S[x][y]>=2)return sum;   /*如果该点已经经过2次了的,死循环,退出*/
 17         if(Map[x][y]==‘E‘&&Map_S[x][y]==0)sum++;    /*如果该点没有被标记过,且为E,sum++*/
 18         Map_S[x][y]++;          /*标记方向,需要用累加的,*/
 19         if(Map[x][y]==‘/‘)
 20         {
 21             switch(Go_To)
 22             {
 23                 case 0:x=x;y=y-1;Go_To=3;break;
 24                 case 1:x=x;y=y+1;Go_To=2;break;
 25                 case 2:x=x-1;y=y;Go_To=1;break;
 26                 case 3:x=x+1;y=y;Go_To=0;break;
 27             }
 28         }
 29         else if(Map[x][y]==‘\\‘)
 30         {
 31             switch(Go_To)
 32             {
 33                 case 0:x=x;y=y+1;Go_To=2;break;
 34                 case 1:x=x;y=y-1;Go_To=3;break;
 35                 case 2:x=x+1;y=y;Go_To=0;break;
 36                 case 3:x=x-1;y=y;Go_To=1;break;
 37             }
 38         }
 39         else if(Map[x][y]==‘.‘||Map[x][y]==‘E‘)
 40         {
 41             switch(Go_To)
 42             {
 43                 case 0:x=x+1;y=y;break;
 44                 case 1:x=x-1;y=y;break;
 45                 case 2:x=x;y=y+1;break;
 46                 case 3:x=x;y=y-1;break;
 47             }
 48         }
 49     }
 50     return sum;
 51 }
 52 int main()
 53 {
 54     int N,M,i,j;
 55     int B_X,B_Y;/*开始点*/
 56     int SUM,sum;
 57     while(scanf("%d%d",&N,&M)!=EOF)
 58     {
 59         for(i=0;i<=N+1;i++)
 60         {
 61             for(j=0;j<=M+1;j++)
 62             {
 63                 if(i==0||j==0||i==N+1||j==M+1){Map[i][j]=‘*‘;continue;}
 64                 scanf(" %c",&Map[i][j]);
 65                 if(Map[i][j]==‘T‘)  /*获取起始点*/
 66                 {
 67                     Map[i][j]=‘.‘;
 68                     B_X=i;B_Y=j;
 69                 }
 70             }
 71         }
 72         SUM=0;
 73         for(i=0;i<4;i++)
 74         {
 75             sum=Work(B_X,B_Y,i);
 76             SUM=max(SUM,sum);
 77         }
 78         printf("%d\n",SUM);
 79     }
 80     return 0;
 81 }
 82 /*
 83
 84 3 4
 85 //\E
 86 /ET/
 87 \///
 88
 89 3 3
 90 /E 91 EET
 92 \E/
 93
 94
 95 3 3
 96 /T 97 ...
 98 \./
 99
100 */

时间: 2024-10-26 03:34:20

B - 瑶瑶带你玩激光坦克的相关文章

acdream 瑶瑶带你玩激光坦克 (模拟)

瑶瑶带你玩激光坦克 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 256000/128000KB (Java/Others) Submit Status Problem Description 有一款名为激光坦克的游戏,游戏规则是用一个坦克发出激光来达到一些目的,激光可以通过一些镜子反射. 机智的瑶瑶为了显示自己的智商高于常人,把这个游戏改造了一下,变成了用激光攻击敌人的游戏. 瑶瑶想知道射一次激光最多可以攻击到多少个敌人. PS:

ACdream 1101 瑶瑶想要玩滑梯

没想到线段树的基本用法这么长时间没写了还没有忘,1A的感觉还是很爽的. 题目大意: 中文题,点此查看题目. 解题思路: 线段树的区间更新与查询. lazy标记的使用. 当需要返回区间多个值时可以使用引用参数. 下面是代码: #include <stdio.h> #include <string.h> #include <algorithm> #include <iostream> #include <math.h> #include <st

ACdream 1099 瑶瑶的第K大

瑶瑶的第K大 Time Limit: 10000/5000MS (Java/Others)Memory Limit: 512000/256000KB (Java/Others) SubmitStatisticNext Problem Problem Description 一天,萌萌的妹子--瑶瑶(tsyao)很无聊,就来找你玩.可是你们都不知道玩什么...尴尬了一阵子,机智的瑶瑶就提议:"这样吧,你说N个整数xi,然后在随意说一个数字k,我能够快速地说出这些数字里面第 k 大的数字."

第K大 [ACdream 1099] 瑶瑶的第K大

瑶瑶的第K大 Time Limit: 10000/5000MS (Java/Others)Memory Limit: 512000/256000KB (Java/Others) SubmitStatisticNext Problem Problem Description 一天,萌萌的妹子--瑶瑶(tsyao)很无聊,就来找你玩.可是你们都不知道玩什么...尴尬了一阵子,机智的瑶瑶就提议:“这样吧,你说N个整数xi,然后在随意说一个数字k,我能够快速地说出这些数字里面第 k 大的数字.” Inp

带你玩转Kubernetes

导读 Kubernetes是著名的容器管理系统,是一个有这很多贡献者的开源大项目,它作为一个不挑食的容器管理框架,可以无处不在.这两天接触K8s,带你玩转K8s,这个教程可以大致让你知道运行更改源码,而且从头测试本地Kubernetes平台集群. Kubernetes是个有很多贡献者的开源大项目,理论上它作为一个不挑食的容器管理框架,可以无处不在.但可惜的是,无论实际编写还是贡献测试代码,引导kubernetes server都不太容易.里边的一些文件对于我来说有些乱,不是挂了的就是过时的.源文

带你玩转Visual Studio——带你高效管理代码

上一篇文章带你玩转Visual Studio--带你高效开发通过对VAssistX优秀插件的讲解,让我们掌握了快速开发C++代码的技能.然而大部分的程序都不是一个人的开发的,是由一个团队的多个人一起开发的,大型的系统还可能由多个不同的团队分包进行开发.多人进行协作开发时,代码的管理就显得及为重要,需要借助代码管理工具的辅助,这种工具又称为版本控制系统. 目前主流的版本控制系统有: CVS:是一个用于代码版本控制的自由软件,它是一个比较早出现的工具,由于它有很多自身的缺陷,现在几乎被SVN所取代了

分分钟带你玩转 Web Services【2】CXF

在实践中一直在使用 JAX-WS 构建 WebService 服务,服务还是非常稳定.高效的. 但还是比较好奇其他的 WebService 开源框架,比如:CXF/Axis2/Spring WS等. 源于对 Apache 的信赖和喜爱, 旗下的 CXF  WebService 肯定也不会让人失望. 所以花了点时间将 CXF 引入到项目实践当中,多一种选择也未尝不可. 对于 WebService 和 CXF 简介这里就不赘述了,不太懂的同学请先移步:分分钟带你玩转 Web Services[1]J

瑶瑶科技 请求样例. (保留一周)

瑶瑶科技 请求样例. (保留一周) package test; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncod

带你玩转Visual Studio——结局汇总

感谢 这一系列文章陆陆续续写了一个月,也差不多可以告一个段落了.感谢读者们一直以来对我关注和支持!现将这一系列文章在这做一个汇总,以方便大家查阅.若是初学者,建议按顺序阅读. 系列文章目录 带你玩转Visual Studio--开篇介绍 带你玩转Visual Studio--带你新建一个工程 带你玩转Visual Studio--带你了解VC++各种类型的工程 带你玩转Visual Studio--带你高效开发 带你玩转Visual Studio--带你高效管理代码 带你玩转Visual Stu