50070. Elevator
難度:3/5
free(ptr)是好習慣。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "elevator.h"
void solve(){
int u, d, f;
char movement[1600];
scanf("%d %d %d %s", &u, &d, &f, movement);
int n = strlen(movement);
Elevator* e = newElevator(u, d, f);
for(int i = 0; i < n; i++){
char now_mv = movement[i];
int rtv;
if(now_mv == 'U') rtv = up(e);
else if(now_mv == 'D') rtv = down(e);
if(rtv == 1) printf("Valid %d\n", getPosition(e));
else if(rtv == 0) printf("Invalid\n");
else{
printf("Broken\n");
break;
}
}
for(int i = 1; i <= f; i++){
if(visited(e, i)) printf("%d\n", i);
}
free(e);
}
int main(){
int t; scanf("%d", &t);
while(t--) solve();
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71// #define MAXF 1000
// #define MAXL 1500
#include <stdio.h>
#include <stdlib.h>
#include "elevator.h"
struct Elevator{
int u;
int d;
int f;
int now_floor;
int cnsc;
int vis[1024];
};
Elevator* newElevator(int u, int d, int F){
Elevator* e = (Elevator*) malloc(sizeof(Elevator));
e->u = u;
e->d = d;
e->f = F;
e->now_floor = 1;
e->cnsc = 0;
for(int i = 1; i <= e->f; i++){
e->vis[i] = 0;
}
e->vis[1] = 1;
return e;
}
int up(Elevator* e){
if(e->now_floor + e->u <= e->f){ // valid
e->now_floor += e->u;
e->cnsc = 0;
e->vis[e->now_floor] = 1;
return 1;
}
else{ // invalid
if(e->cnsc < 0) e->cnsc = 1;
else e->cnsc += 1;
if(e->cnsc >= 4) return -1;
else return 0;
}
}
int down(Elevator* e){
if(e->now_floor - e->d >= 1){ // valid
e->now_floor -= e->d;
e->cnsc = 0;
e->vis[e->now_floor] = 1;
return 1;
}
else{ // invalid
if(e->cnsc > 0) e->cnsc = -1;
else e->cnsc -= 1;
if(e->cnsc <= -4) return -1;
else return 0;
}
}
int visited(Elevator* e, int floor){
if(floor > e->f || floor < 1) return 0;
else return e->vis[floor];
}
int getPosition(Elevator* e){
return e->now_floor;
}