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
.*/E\
E*.*.
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[][];
int Map_S[][];
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]>=)return;
Map_S[x][y]++;
if(Map[x][y]=='/')
{
if(N==)BFS(x,y-,);
if(N==)BFS(x,y+,);
if(N==)BFS(x-,y,);
if(N==)BFS(x+,y,);
}
if(Map[x][y]=='\\')
{
if(N==)BFS(x,y+,);
if(N==)BFS(x,y-,);
if(N==)BFS(x+,y,);
if(N==)BFS(x-,y,);
}
if(Map[x][y]=='.'||Map[x][y]=='T'||Map[x][y]=='E')
{
if(Map[x][y]=='E'&&Map_S[x][y]==)sum++;
if(N==)BFS(x+,y,N);
if(N==)BFS(x-,y,N);
if(N==)BFS(x,y+,N);
if(N==)BFS(x,y-,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=;i<=N;i++)scanf(" %s",Map[i]+);
for(i=;i<=N+;i++)
{
for(j=;j<=M+;j++)
{
Map_S[i][j]=;
if(i==||j==||i==N+||j==M+){Map[i][j]='*';continue;}
if(Map[i][j]=='T')
{
Map[i][j]='.';
Begin_X=i;
Begin_Y=j;
}
}
}
/* Put(N,M);*/
SUM=;
for(i=;i<;i++)
{
sum=;
BFS(Begin_X,Begin_Y,i);
SUM=max(SUM,sum);
}
printf("%d\n",SUM); }
return ;
}
/*
3 3
/E\
EET
\E/ 3 3
/.\
..T
\./ 3 4
//E\
/TE/
\/E/ 3 2
/\
ET
\/ */
这个是AC的代码。。。
 #include <algorithm>
#include <iostream>
#include <stdio.h>
#include <string.h>
#define max(a,b)a>b?a:b
using namespace std;
char Map[][];
int Map_S[][];
int Work(int x,int y,int Go_To)/*x,y,为坐标,Go_To为方向*/
{
memset(Map_S,,sizeof(Map_S));
int sum=;
while()
{
if(Map[x][y]=='*')return sum; /*如果为墙的话,就退出*/
if(Map_S[x][y]>=)return sum; /*如果该点已经经过2次了的,死循环,退出*/
if(Map[x][y]=='E'&&Map_S[x][y]==)sum++; /*如果该点没有被标记过,且为E,sum++*/
Map_S[x][y]++; /*标记方向,需要用累加的,*/
if(Map[x][y]=='/')
{
switch(Go_To)
{
case :x=x;y=y-;Go_To=;break;
case :x=x;y=y+;Go_To=;break;
case :x=x-;y=y;Go_To=;break;
case :x=x+;y=y;Go_To=;break;
}
}
else if(Map[x][y]=='\\')
{
switch(Go_To)
{
case :x=x;y=y+;Go_To=;break;
case :x=x;y=y-;Go_To=;break;
case :x=x+;y=y;Go_To=;break;
case :x=x-;y=y;Go_To=;break;
}
}
else if(Map[x][y]=='.'||Map[x][y]=='E')
{
switch(Go_To)
{
case :x=x+;y=y;break;
case :x=x-;y=y;break;
case :x=x;y=y+;break;
case :x=x;y=y-;break;
}
}
}
return sum;
}
int main()
{
int N,M,i,j;
int B_X,B_Y;/*开始点*/
int SUM,sum;
while(scanf("%d%d",&N,&M)!=EOF)
{
for(i=;i<=N+;i++)
{
for(j=;j<=M+;j++)
{
if(i==||j==||i==N+||j==M+){Map[i][j]='*';continue;}
scanf(" %c",&Map[i][j]);
if(Map[i][j]=='T') /*获取起始点*/
{
Map[i][j]='.';
B_X=i;B_Y=j;
}
}
}
SUM=;
for(i=;i<;i++)
{
sum=Work(B_X,B_Y,i);
SUM=max(SUM,sum);
}
printf("%d\n",SUM);
}
return ;
}
/* 3 4
//\E
/ET/
\/// 3 3
/E\
EET
\E/ 3 3
/T\
...
\./ */

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

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

    瑶瑶带你玩激光坦克 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 256000/128000KB (Java/Others) Submi ...

  2. [ACdream]瑶瑶带你玩激光坦克

    题目链接:http://acdream.info/contest?cid=1269#problem-B Problem Description 有一款名为激光坦克的游戏,游戏规则是用一个坦克发出激光来 ...

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

    瑶瑶的第K大 Time Limit: 4000/2000MS (Java/Others) Memory Limit: 256000/128000KB (Java/Others) Problem Des ...

  4. ACdream 1099——瑶瑶的第K大——————【快排舍半,输入外挂】

    瑶瑶的第K大 Time Limit:2000MS     Memory Limit:128000KB     64bit IO Format:%lld & %llu Submit Status ...

  5. 带你玩转Visual Studio

    带你玩转Visual Studio 带你新建一个工程 工程目录下各文件的含义 解决方案与工程 在这之前先了解一个概念:解决方案与工程. 解决方案(Solution):一个大型项目的整体的工作环境: 工 ...

  6. 来吧!带你玩转 Excel VBA

    来吧!带你玩转 Excel VBA 从错失良机到艰辛的DOS征程,从坎坷购机自学路到转机起程,从爱好到事业,他从一个完全不懂电脑的人到VBA高级应用者,一切全是自学…… 我是罗刚君,来自四川的一个小县 ...

  7. 转: 带你玩转Visual Studio——带你理解多字节编码与Unicode码

    上一篇文章带你玩转Visual Studio——带你跳出坑爹的Runtime Library坑帮我们理解了Windows中的各种类型C/C++运行时库及它的来龙去脉,这是C++开发中特别容易误入歧途的 ...

  8. ACdream 1103 瑶瑶正式成为CEO(树链剖分+费用流)

    Problem Description 瑶瑶(tsyao)是某知名货运公司(顺丰)的老板,这个公司很大,货物运输量极大,因此公司修建了许多交通设施,掌控了一个国家的交通运输. 这个国家有n座城市,公司 ...

  9. ACdream 1104 瑶瑶想找回文串(SplayTree + Hash + 二分)

    Problem Description 刚学完后缀数组求回文串的瑶瑶(tsyao)想到了另一个问题:如果能够对字符串做一些修改,怎么在每次询问时知道以某个字符为中心的最长回文串长度呢?因为瑶瑶整天只知 ...

随机推荐

  1. CodeForces 659F Polycarp and Hay

    并查集,$dfs$. 从大的数字往里加,每加一个数字合并一下连通块,判断连通块内数字个数是否够,以及k能不能被当前加入的数字整除.然后$dfs$一下构造答案. #pragma comment(link ...

  2. CodeForces 709C Letters Cyclic Shift

    贪心. 肯定是两个$a$之间的那些字符都$-1$,没有$a$就全部$-1$.如果输入的串全是$a$,那么把最后一个$a$改成$z$. #pragma comment(linker, "/ST ...

  3. js生成缩略图后上传并利用canvas重绘

    function drawCanvasImage(obj,width, callback){ var $canvas = $('<canvas></canvas>'), can ...

  4. Abstraction elimination

    (本文不保证不误人子弟,切勿轻信) Unlambda指的是lambda计算中去掉lambda操作(does not have lambda(or abstraction) operation of t ...

  5. WWW 资源下载与表单提交

    在注册与验证用户信息,以及非即时通信的游戏中,我们可以使用WWW类使用短链接来完成客户端与服务器数据的通信,今天我们将使用用POST方法来完成的用户注册与登录,在最后介绍下其它资源的加载. 首先使用P ...

  6. NSDateComponents

    NSDateComponents将时间表示成适合人类阅读和使用的方式, 首先要遵循某种历法 NSCalendar * cal = [NSCalendar currentCalendar]; 有三种用法 ...

  7. 关于pagerank算法的一点点总结

    1. PageRank算法每个顶点收敛的值与每个点的初值是没有关系的,每个点随便赋初值. 2.像q=0.8这样的阻尼系数已经解决了PageRank中处在的孤立点问题.黑洞效应问题. 3.当有那个点进行 ...

  8. sap 设备cnsapwin不支持页格式*****

    SAP SMARTFORMS 打印 CNSAPWIN 不支持页格式 解决办法: 在smartforms里的表格属性虽然定义了要打印的页格式 ZUNIA5 ,但是打印时会提示错误:" CNSA ...

  9. @Autowired与 @Resource

    @Autowired, @Resource 1.注解类型: Autowired可用于构造器.属性.方法.注解 @Target({ElementType.CONSTRUCTOR, ElementType ...

  10. JAVA MONGODB group查询的UTC时间问题

    BasicDBList dateList = new BasicDBList(); dateList.add("$t"); dateList.add(28800000); DBOb ...