P2206题解
题目大意:
给定一些指令,计算需要多大的舞台。
这是一道大模拟!!!
只要遍历每次指令,然后判断是否摔倒,摔倒输出`-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 }