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

 

 

  瑶瑶带你玩激光坦克

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




思路:简单模拟即可。但是不能用递归,会爆。特别要注意的是数据
读入的问题(有可能不是你想的那样的输入),还有重复统计(两次射过同个点)的问题。结束的条件是射出场外或'*'或同点同方向遍历过。


 1 #include <bits/stdc++.h>
 2 #define LL long long
 3 #define pii pair<int,int>
 4 #define INF 0x7f7f7f7f
 5 using namespace std;
 6 const int N=1000+100;
 7 int n, m;
 8 char g[N][N], gg[N][N];
 9 bool vis[N][N][5];
10 int tarx, tary;
11 
12 inline bool isingraph(int x,int y)  //是否在场内
13 {
14     if(x>0&&x<=n && y>0&&y<=m)    return 1;
15     else    return 0;
16 }
17 
18 
19 
20 int shot(int x, int y, int flag)      //1上,2右,3下,4左
21 {
22     int sum=0;
23     while(isingraph(x,y)==1 && gg[x][y]!='*' && vis[x][y][flag]==0 )
24     {
25         vis[x][y][flag]=1;  //注意有4个方向,只有同个点,同个方向遍历过才可结束。可能无限循环。
26         if(gg[x][y]=='\')
27         {
28             if(flag==1)    y--,flag=4;
29             else if(flag==2)    x++,flag=3;
30             else if(flag==3)    y++,flag=2;
31             else if(flag==4)    x--,flag=1;
32         }
33         else if(gg[x][y]=='/')
34         {
35             if(flag==1)    y++,flag=2;
36             else if(flag==2)    x--,flag=1;
37             else if(flag==3)    y--,flag=4;
38             else if(flag==4)    x++,flag=3;
39         }
40         else        //E . 都在这
41         {
42             if(gg[x][y]=='E')      sum++;  //敌人
43             gg[x][y]='.';           //撞到E就改为'.'   防止多次统计
44             if(flag==1)         x--,flag=1;
45             else if(flag==2)    y++,flag=2;
46             else if(flag==3)    x++,flag=3;
47             else if(flag==4)    y--,flag=4;
48         }
49     }
50     return sum;
51 }
52 
53 
54 int cal()
55 {
56     int ans=0;
57     for(int i=1; i<5; i++)
58     {
59         memset(vis, 0, sizeof(vis));
60         memcpy(gg, g, sizeof(g));   //复制一个图出来,为了不破坏原图
61         ans=max(ans, shot(tarx, tary, i));
62     }
63     return ans;
64 }
65 
66 int main()
67 {
68     char c;
69     freopen("input.txt", "r", stdin);
70     while(~scanf("%d%d",&n,&m))
71     {
72         memset(g,0,sizeof(g));
73         for(int i=1; i<=n; i++)
74         {
75             for(int j=1; j<=m; j++)
76             {
77                 c=getchar();
78                 if(c == 'E' || c == '.' || c == '/' || c == '\' || c == 'T' || c == '*')
79                     g[i][j]=c;
80                 else    j--;
81                 if(g[i][j]=='T')    tarx=i,tary=j;  //找人物坐标
82             }
83         }
84         printf("%d
",cal());
85     }
86     return 0;
87 }
AC代码







原文地址:https://www.cnblogs.com/xcw0754/p/4651488.html