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. C语言温度

    #include <stdio.h> #include <stdlib.h> /* run this program using the console pauser or a ...

  2. 《JavaScript网页经典特效300例》

    <JavaScript网页经典特效300例> 基础篇 进阶篇 高级篇

  3. Spring Security(19)——对Acl的支持

    目录 1.1           准备工作 1.2           表功能介绍 1.2.1     表acl_sid 1.2.2     表acl_class 1.2.3     表acl_obj ...

  4. 【noi openjudge题解】最低通行费

    这道题完全没有必要去计算限制时间,把时间当做一个参数来做就行了.知道了这一点之后就可以直接使用DP求解了 #include <algorithm> #include <iostrea ...

  5. JQUERY 轮播插件

    闲来无事,写个轮播插件,项目中用到的时候就无需在写了,不然会累死宝宝的 废话少说 代码上 html部分 <div class="lunbo"> <ul> & ...

  6. php和node高并发 大数据量怎么处理

    有的时候可能因为疏忽忘记注册Service直接就使用了,使用那个Service时会报异常.这种情况项目都是可以编译通过的,是一个不太容易发现的BUG,如果那个Service在测试时没有覆盖到这个BUG ...

  7. 在MVC里使用 HttpContext.Response输出内容

    public ActionResult About() { byte[] ss = System.Text.Encoding.UTF8.GetBytes("111122"); Ht ...

  8. 一箭N雕:多任务深度学习实战

    1.多任务学习导引 多任务学习是机器学习中的一个分支,按1997年综述论文Multi-task Learning一文的定义:Multitask Learning (MTL) is an inducti ...

  9. Table表格横竖线实现Css

    .tablel { border-collapse:collapse; /* 关键属性:合并表格内外边框(其实表格边框有2px,外面1px,里面还有1px哦) */ border:solid #999 ...

  10. wpf 控件截屏

    /// <summary> /// 保存截图 /// </summary> /// <param name="ui">控件名称</para ...