50124. Knights' Tour with Functions

難度:4.2/5 Used Time: 29:12

複雜細節多。

main.c

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
#include <stdio.h>
#include <stdlib.h>
#include "nextMove.h"
#include "validMoveNum.h"

int n, m;
int vis[100][100] = {0};
int k[10005][2] = {0};
int step[10005] = {0};
int moving_k;

static int dx[8] = {-2, -1, 1, 2, 2, 1, -1, -2};
static int dy[8] = {1, 2, 2, 1, -1, -2, -2, -1};

static inline void ipt(){
scanf("%d %d", &n, &m);
for(int i = 1; i <= m; i++){
scanf("%d %d", &k[i][0], &k[i][1]);
step[i] = 0;
vis[k[i][0]][k[i][1]] = 10000 * i;
}
moving_k = m;
}

static inline void solve(){
while(moving_k > 0){
for(int i = 1; i <= m; i++){
if(step[i] == -1) continue;

int nxt_move = nextMove(k[i][0], k[i][1], n, vis);
// printf("idx %d, having nxt %d\n", i, nxt_move);
if(nxt_move == -1){
step[i] = -1;
moving_k--;
}
else{
step[i]++;
k[i][0] += dx[nxt_move];
k[i][1] += dy[nxt_move];
vis[k[i][0]][k[i][1]] = 10000 * i + step[i];
}
}
}
}

static inline void print(){
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
printf("%d%c", vis[i][j], (j == n - 1) ? '\n' : ' ');
}
}
}

int main(){
ipt();
solve();
print();
}

validMoveNum.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "validMoveNum.h"

static int dx[8] = {-2, -1, 1, 2, 2, 1, -1, -2};
static int dy[8] = {1, 2, 2, 1, -1, -2, -2, -1};

static inline int is_valid(int x, int y, int n, int vis[100][100]){
return x >= 0 && y >= 0 && x < n && y < n && vis[x][y] == 0;
}

int validMoveNum(int r, int c, int n, int vis[100][100]){
if(!is_valid(r, c, n, vis)) return -1;

int cnt = 0;
for(int i = 0; i < 8; i++){
if(is_valid(r + dx[i], c + dy[i], n, vis)) cnt++;
}
return cnt;
}

nextMove.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "validMoveNum.h"
#include "nextMove.h"

static int dx[8] = {-2, -1, 1, 2, 2, 1, -1, -2};
static int dy[8] = {1, 2, 2, 1, -1, -2, -2, -1};

static inline int is_valid(int x, int y, int n, int vis[100][100]){
return x >= 0 && y >= 0 && x < n && y < n && vis[x][y] == 0;
}

int nextMove(int r, int c, int n, int vis[100][100]){
// if(!is_valid(r, c, n, vis)) return -1;
int min_idx = -1, min_p = 99;
for(int i = 0; i < 8; i++){
int x = r + dx[i], y = c + dy[i];
if(!is_valid(x, y, n, vis)) continue;
int cnt = validMoveNum(x, y, n, vis);
if(cnt < min_p) min_idx = i, min_p = cnt;
}
return min_idx;
}

50124. Knights' Tour with Functions
https://aaronlin1229.github.io/judgegirl_50124/
Author
Akizumi
Posted on
July 17, 2023
Licensed under