P2206题解

发布时间 2023-09-09 11:23:54作者: mouse_boy

题目大意:

给定一些指令,计算需要多大的舞台。

这是一道大模拟!!!

只要遍历每次指令,然后判断是否摔倒,摔倒输出`-1`否则记录,最后求出面积就行了。

最后附上代码

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int xx[] = {-1, 0, 1, 0}, yy[] = {0, 1, 0, -1};//不同方向的x,y移动数量
 4 struct node {
 5   int y, x;
 6 } a[] = {{114514, 1919810}, {0, 0}, {0, 1}, {1, 0}, {1, 1}};//记录四只脚的位置
 7 int fx, miny = INT_MAX, minx = INT_MAX, maxy = INT_MIN, maxx = INT_MIN, n;
 8 bool flag = 1;
 9 string s;
10 int help(string s) {
11   int f = 1;//记录是那只脚
12   if (s[0] == 'F' && s[1] == 'R') {
13     f = 2;
14   } else if (s[0] == 'R') {
15     if (s[1] == 'L') {
16       f = 3;
17     } else {
18       f = 4;
19     }
20   }
21   if (s[2] == 'P') {
22     for (int i = 1; i <= 4; i++) {
23       int ny = a[f].y + a[i].x - a[f].x;
24       int nx = a[f].x + a[f].y - a[i].y;
25       a[i].y = ny, a[i].x = nx;
26     }
27     fx = (fx + 1) % 4;//记录方向(模4可保证不RE)
28   } else {
29     int m = 0;
30     if (s[2] == 'R') {
31       m = 1;
32     }
33     if (s[2] == 'B') {
34       m = 2;
35     }
36     if (s[2] == 'L') {
37       m = 3;
38     }
39     m = (m + fx) % 4;//记录方向(模4可保证不RE)
40     a[f].y += xx[m];
41     a[f].x += yy[m];//记录坐标
42     for (int i = 1; i <= 4; i++) {
43       if (f != i && a[f].y == a[i].y && a[f].x == a[i].x) {//判断是否会摔倒
44         return 0;//返回不行
45       }
46     }
47   }
48   for (int i = 1; i <= 4; i++) {
49     miny = min(miny, a[i].y);
50     maxy = max(maxy, a[i].y);
51     minx = min(minx, a[i].x);
52     maxx = max(maxx, a[i].x);//取最大值与最小值
53   }
54   return 1;//返回可以
55 }
56 int main() {
57   cin >> n;
58   for (int i = 1; i <= n; i++) {
59     cin >> s;
60     if (!(flag = help(s))) {//判断可行性
61       break;
62     }
63   }
64   if (flag) {//判断并输出
65     cout << (maxy - miny + 1) * (maxx - minx + 1);//计算面积
66   } else {
67     cout << -1;
68   }
69   return 0;//华丽的结束
70 }
Code