50044. Caterpillar in Panic

難度:4.5/5 Used Time: 30:49

細節多。 學到的東西:

  1. \(d \in \{0, 1, 2, 3\}\),所以可以建立

    1
    int dx[] = {1, -1, 0, 0}, dy[] ={0, 0, 1, -1};
    然後更新head可以使用:
    1
    head_x += dx[d], head_y += dy[d];

  2. 1
    2
    3
    4
    len = abs(sx - ex) + abs(sy - ey) + 1;
    if(sx == ex) dx = 0, dy = (sy < ey ? 1 : -1);
    else dy = 0, dx = (sx < ex ? 1 : -1);

Ver 1

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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>

int n, m;
int sx, sy, ex, ey;
int q;
int len;
int head, tail;
int flag = true;

int map[1005][1005];
int row[1005];
int col[1005];

void print_map(){
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
printf("%d", map[i][j]);
}
printf("\n");
}
}

bool is_valid(int x, int y){
return (x >= 0 && x < n &&
y >= 0 && y < m &&
map[x][y] == 0);
}

void ipt(){
scanf("%d %d", &n, &m);
scanf("%d %d %d %d", &sx, &sy, &ex, &ey);
scanf("%d", &q);

if(sx == ex){
len = abs(ey - sy) + 1;
if(sy < ey){
for(int i = 0; i < len; i++) row[i] = sx;
for(int i = 0, n = sy; i < len; i++, n++) col[i] = n;
}
else{
for(int i = 0; i < len; i++) row[i] = sx;
for(int i = 0, n = sy; i < len; i++, n--) col[i] = n;
}
}
else{
len = abs(ex - sx) + 1;
if(sx < ex){
for(int i = 0; i < len; i++) col[i] = sy;
for(int i = 0, n = sx; i < len; i++, n++) row[i] = n;
}
else{
for(int i = 0; i < len; i++) col[i] = sy;
for(int i = 0, n = sx; i < len; i++, n--) row[i] = n;
}
}

for(int i = 0; i < n; i++) for(int j = 0; j < m; j++){
map[i][j] = 0;
}
for(int i = 0; i < len; i++){
map[row[i]][col[i]] = 1;
}
head = 0, tail = len - 1;

}

void move(){
int d; scanf("%d", &d);

int tail_x = row[tail], tail_y = col[tail];
map[tail_x][tail_y] = 0;
tail = tail > 0 ? tail - 1 : len - 1; // tail--;

int head_x = row[head], head_y = col[head];
if(d == 0) head_x += 1;
else if(d == 1) head_x -= 1;
else if(d == 2) head_y += 1;
else if(d == 3) head_y -= 1;

if(is_valid(head_x, head_y)){
map[head_x][head_y] = 1;
head = head > 0 ? head - 1 : len - 1;
row[head] = head_x, col[head] = head_y;
}
else{
map[tail_x][tail_y] = 1;
flag = false;
return;
}
}

int main(){
ipt();
for(int i = 0; i < q && flag; i++) move();
print_map();
}

Ver 2

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
72
73
74
75
76
77
78
79
80
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>

int n, m;
int sx, sy, ex, ey;
int q;

int len;
int head, tail;
int row[1024], col[1024];
int map[1024][1024];

bool flag = true;

void print_map(){
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
printf("%d", map[i][j]);
}
puts("");
}
}
void ipt(){
scanf("%d %d", &n, &m);
scanf("%d %d %d %d", &sx, &sy, &ex, &ey);
scanf("%d", &q);

int dx, dy;
len = abs(ex - sx) + abs(ey - sy) + 1;
head = 0, tail = len - 1;
if(sx == ex) dx = 0, dy = (sy < ey ? 1 : -1);
else dy = 0, dx = (sx < ex ? 1 : -1);

for(int i = 0; i < n; i++) for(int j = 0; j < m; j++){
map[i][j] = 0;
}
for(int i = 0, now_x = sx, now_y = sy; i < len; i++, now_x += dx, now_y += dy){
map[now_x][now_y] = 1;
row[i] = now_x, col[i] = now_y;
}
}

bool is_valid(int x, int y){
return (x >= 0 && x < n &&
y >= 0 && y < m &&
map[x][y] == 0);
}

void move(){
int d; scanf("%d", &d);
int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1};

int tail_x = row[tail], tail_y = col[tail];
map[tail_x][tail_y] = 0;
tail = tail > 0 ? tail - 1 : len - 1;

int head_x = row[head], head_y = col[head];
head_x += dx[d], head_y += dy[d];
if(is_valid(head_x, head_y)){
map[head_x][head_y] = 1;
head = head > 0 ? head - 1 : len - 1;
row[head] = head_x, col[head] = head_y;
}
else{
map[tail_x][tail_y] = 1;
flag = false;
}
}

int main(){
ipt();
for(int i = 0; i < q && flag; i++){
move();
}
print_map();
return 0;
}


50044. Caterpillar in Panic
https://aaronlin1229.github.io/judgegirl_50044/
Author
Akizumi
Posted on
July 17, 2023
Licensed under