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个字符描述地图。

. 表示此处为空地

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

T 代表瑶瑶的坦克位置

E 代表敌人

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

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

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 706A Beru-taxi

    简单题. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #inclu ...

  2. do{...}while(0)的意义和用法(转载)

    linux内核和其他一些开源的代码中,经常会遇到这样的代码: do{ ... }while(0) 这样的代码一看就不是一个循环,do..while表面上在这里一点意义都没有,那么为什么要这么用呢? 实 ...

  3. 浙大pat1020题解

    1020. Tree Traversals (25) 时间限制 400 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Suppo ...

  4. 运行CUDA实例时候出现的问题

    问题一:>LINK : fatal error LNK1123: 转换到 COFF 期间失败:文件无效或损坏 将 项目——项目属性——配置属性——连接器——清单文件——嵌入清单 “是”改为“否” ...

  5. GNU/Linux超级本ZaReason Ultralap 440体验

    老早就在网上看到有关ZaReason公司推出了业界首款Linux超级本Ultralap 430的新闻.通过网上搜索,我了解到ZaReason是一家专门制作与销售预装Linux台式机.笔记本.超级本.平 ...

  6. Chapter 21_1 字符串函数

    接下来开始接触Lua强大的字符串处理能功能——字符串库. 原始的Lua解释器操作字符串的能力很有限,真正强大的能力还是来自字符串库. 它所有的函数都在模块string中.它还为strings设置了一个 ...

  7. 关于mongodb的一些笔记

    1.以服务的形式安装mongodb dos -- 进入到mongodb的bin目录下,执行 D:\mongodb\bin>mongod --logpath D:\mongodb\logs\mon ...

  8. HTML5历史管理

    边看视频边做的练习,随机显示数字,分别使用history和hash来实现历史管理 <!doctype html> <html> <head> <meta ch ...

  9. JavaScript-Curry

    Currying allows you to easily create custom functions by partially invoking an existing function. He ...

  10. 【Python之路】第四篇--Python基础之函数

    三元运算 三元运算(三目运算),是对简单的条件语句的缩写 # 书写格式 result = 值1 if 条件 else 值2 # 如果条件成立,那么将 “值1” 赋值给result变量,否则,将“值2” ...