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. Form标签+Css基础

      一.Form表单标签 <form action="" method=""></form>    表单就是用来将用户的信息提交到服务器 ...

  2. awk学习笔记二:调用shell、文件执行(转)

    awk 'BEGIN {print "Hello"}' 不操作文件直接处理数据流 要调用shell则可以用管道命令 如,打印日期awk 'BEGIN {"date&quo ...

  3. AnimatorController反向运动学IK

    通过使用反向运动学IK,我们可以根据需要控制角色身体某个特定部位进行旋转或移动,达到想要的一些效果,比如:在移动时,让一只脚带伤拖行:让手抬起去拿桌上的苹果:让脑袋一直面向我们的色像机,就像一直注视着 ...

  4. ElasticSearch(8)-分布式搜索

    分布式搜索的执行方式 在继续之前,我们将绕道讲一下搜索是如何在分布式环境中执行的. 它比我们之前讲的基础的增删改查(create-read-update-delete ,CRUD)请求要复杂一些. 注 ...

  5. 利用LibreOffice与ImageMagick将网页分享至微信

    现在越来越多的内容分享都是在微信上进行了.然而,若想将电脑浏览器中看到的感兴趣的网页分享至微信,则只能以纯文本的方式粘贴超级链接,而不能直接拷贝图文混排的HTML.因此,我想到不妨借助LibreOff ...

  6. matlab,xls转换为mat文件

    b=xlsread('iris_data.xls');save iris_data.mat b

  7. Dynamics CRM 相关资料

    links: 1.The Microsoft Dynamics CRM Team Blog 2.申请试用Dynamics CRM 2013 http://www.microsoft.com/zh-cn ...

  8. es6语法

    let定义变量,特性: 1,不允许重复定义 2,不存在预解析 3,变量存在于会块级作用域 即{}内部 const : 定义常量,常量的值不能修改,若常量是对象 对象下的属性可修改. 解构赋值语法: 数 ...

  9. ionic的弹出框$ionicPopover

    在ionic.html中 在controller.js中

  10. notepad++正则表达式替换字符串详解

    正则表达式是一个查询的字符串,它包含一般的字符和一些特殊的字符,特殊字符可以扩展查找字符串的能力,正则表达式在查找和替换字符串的作用不可忽视,它 能很好提高工作效率. EditPlus的查找,替换,文 ...