習題參考解答
===
習題 1
---
### Diamond
```clike=
#include <stdio.h>
int main() {
printf(" *\n");
printf(" * *\n");
printf(" * * *\n");
printf(" * * * *\n");
printf(" * * * * *\n");
printf(" * * * * * *\n");
printf(" * * * * * * *\n");
printf(" * * * * * * * *\n");
printf(" * * * * * * * * *\n");
printf("* * * * * * * * * *\n");
printf(" * * * * * * * * *\n");
printf(" * * * * * * * *\n");
printf(" * * * * * * *\n");
printf(" * * * * * *\n");
printf(" * * * * *\n");
printf(" * * * *\n");
printf(" * * *\n");
printf(" * *\n");
printf(" *\n");
return 0;
}
```
習題 2
---
### Judge Girl 50114. Simple Polygon
```clike
#include <stdio.h>
int main() {
int ax, ay, bx, by, cx, cy, dx, dy;
scanf("%d%d%d%d%d%d%d%d", &ax, &ay, &bx, &by, &cx, &cy, &dx, &dy);
int perimeter = bx - ax + by - ay + cx - bx + cy - by + cx - dx + cy - dy + dx - ax + dy - ay;
int area = (cx - ax) * (cy - ay) - (dx - ax) * (cy - dy) - (cx - bx) * (by - ay);
printf("%d\n%d\n", perimeter, area);
return 0;
}
```
### Judge Girl 50115. Depth of Water
```clike
#include <stdio.h>
int main() {
int a, b, h, c, d;
scanf("%d%d%d%d%d", &a, &b, &h, &c, &d);
printf("%d\n", a*b*h / (a*b - c*d));
return 0;
}
```
### Judge Girl 50078. Parallelogram
```clike
#include <stdio.h>
int main() {
int ax, ay, bx, by, cx, cy;
scanf("%d%d%d%d%d%d", &ax, &ay, &bx, &by, &cx, &cy);
printf("%d\n%d\n", cx + bx - ax, cy + by - ay);
printf("%d\n%d\n", cx + ax - bx, cy + ay - by);
printf("%d\n%d\n", bx + ax - cx, by + ay - cy);
return 0;
}
```
### Judge Girl 50079. Apple Pile
```clike
#include <stdio.h>
int main() {
int a, b;
scanf("%d %d", &a, &b);
printf("%d\n", (a + b)*(b - a + 1) / 2);
printf("%d\n", a + b + (b - a - 1) * 2);
return 0;
}
```
習題 3
---
### Judge Girl 50116. Play with digits
```clike
#include <stdio.h>
int main() {
int n, digits = 0, zero = 0, oddSum = 0, evenSum = 0;
while (scanf("%d", &n) == 1) {
digits++;
if (n == 0)
zero++;
if (digits % 2)
oddSum += n;
else
evenSum += n;
}
int even = (n % 2 == 0)? 1 : 0;
int divisible = !((oddSum - evenSum) % 11);
printf("%d\n%d\n%d\n%d\n", digits, even, zero, divisible);
return 0;
}
```
### Judge Girl 50117. Divide a number
```clike
#include <stdio.h>
int main() {
int k, n;
scanf("%d", &k);
int temp = 0;
int zero = 1;
while (scanf("%d", &n) == 1) {
if (temp == 0) {
if (n < k && n != 0) {
temp = n * 10;
if (zero == 0)
printf("0\n");
}
else {
printf("%d\n", n / k);
zero = 0;
temp = (n % k) * 10;
}
}
else {
temp += n;
printf("%d\n", temp / k);
zero = 0;
temp = (temp % k) * 10;
}
}
if (zero == 1)
printf("0\n");
return 0;
}
```
### Judge Girl 50080. Scan The Blocks
```clike
#include <stdio.h>
int main() {
int n;
while (scanf("%d", &n) != EOF) {
int max = -10001, min = 10001;
for (int i = 0; i < n; i++) {
int number;
if (scanf("%d", &number) == EOF) {
printf("%d\n", min);
return 0;
}
if (number < min)
min = number;
if (number > max)
max = number;
}
printf("%d\n", max);
}
return 0;
}
```
### Judge Girl 50081. Rebot Simulation
```clike
#include <stdio.h>
int main(void) {
int N, M, ins, x = 0, y = 0;
scanf("%d%d", &N, &M);
printf("%d\n%d\n", x, y);
while (scanf("%d", &ins) != EOF) {
if (ins%5 == 0)
continue;
else if (ins%5 == 1) {
if (x + ins > N - 1)
continue;
else
x += ins;
}
else if (ins%5 == 2) {
if (x - ins < 0)
continue;
else
x -= ins;
}
else if (ins%5 == 3) {
if (y + ins > M - 1)
continue;
else
y += ins;
}
else {
if (y - ins < 0)
continue;
else
y -= ins;
}
printf("%d\n%d\n", x, y);
}
return 0;
}
```
### Codeforces: Theatre Square
這題要注意的是雖然$n,m,a$的取值範圍都在$10^9$裡面(可以用int表示),但當$a$的值很小,$n,m$的值很大,$(n/a)(m/a)$是會超過$10^9$的。
```clike
#include <stdio.h>
int main() {
int n, m, a;
scanf("%d%d%d", &n, &m, &a);
long long x = (n % a)? 1 : 0, y = (m % a)? 1 : 0;
x += n / a;
y += m / a;
printf("%lld\n", x * y);
return 0;
}
```
習題 4
---
### Judge Girl 50119. Paper, Scissors, Stone
```clike
#include <stdio.h>
int main() {
int xt, a, b, c;
scanf("%d%d%d%d", &xt, &a, &b, &c);
int yt, d, e, f;
scanf("%d%d%d%d", &yt, &d, &e, &f);
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
int whoWins, pairs = 0, draw = 1;
while (draw) {
int x = xt % 3, y = yt % 3;
xt = ((a * xt) + b) % c;
yt = ((d * yt) + e) % f;
pairs++;
if ((x == 0 && y == 0) || (x == 1 && y == 1) || (x == 2 && y == 2))
continue;
else if ((x == 0 && y == 2) || (x == 1 && y == 0) || (x == 2 && y == 1)) {
draw = 0;
whoWins = 0;
}
else if ((y == 0 && x == 2) || (y == 1 && x == 0) || (y == 2 && x == 1)) {
draw = 0;
whoWins = 1;
}
}
printf("%d %d\n", whoWins, pairs);
}
return 0;
}
```
### Judge Girl 50120. Consecutive 1's
```clike
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
int a[n][n];
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
scanf("%d", &a[i][j]);
int max = 0;
// row
for (int i = 0; i < n; i++) {
int current = 0;
for (int j = 0; j < n; j++) {
if (a[i][j] == 1) {
current++;
if (current > max)
max = current;
}
else
current = 0;
}
}
// column
for (int i = 0; i < n; i++) {
int current = 0;
for (int j = 0; j < n; j++) {
if (a[j][i] == 1) {
current++;
if (current > max)
max = current;
}
else
current = 0;
}
}
// diagonal
for (int i = 0; i < n; i++) {
int current = 0;
for (int j = 0; i + j < n; j++) {
if (a[j][j+i] == 1) {
current++;
if (current > max)
max = current;
}
else
current = 0;
}
current = 0;
for (int j = 0; i + j < n; j++) {
if (a[i+j][j] == 1) {
current++;
if (current > max)
max = current;
}
else
current = 0;
}
}
printf("%d\n", max) ;
return 0;
}
```
### Judge Girl 50121. Push Stones
```clike
#include <stdio.h>
int main() {
int n, m;
scanf("%d%d", &n, &m);
int map[n][m];
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
map[i][j] = 0;
int x, y, energy;
scanf("%d%d%d", &y, &x, &energy);
map[y][x] = energy;
int stones;
scanf("%d", &stones);
for (int i = 0; i < stones; i++) {
int x, y, weight;
scanf("%d%d%d", &y, &x, &weight);
map[y][x] = weight;
}
int instruction;
while (scanf("%d", &instruction) == 1) {
if (instruction == 0) {
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
printf("%d%c", map[i][j], j == m - 1? '\n' : ' ');
}
else if (instruction == 1) {
if (x < m - 1) {
int stoneX = x + 1, stoneY = y, valid = 1, cost = 0, stoneCount = 0;
while (valid) {
if (cost > energy) {
valid = 0;
break;
}
if (stoneX >= m - 1 && map[stoneY][stoneX] != 0) {
valid = 0;
break;
}
if (stoneX < m - 1 && map[stoneY][stoneX] != 0) {
if (energy - cost >= map[stoneY][stoneX]) {
cost += map[stoneY][stoneX];
stoneX++;
stoneCount++;
}
else {
valid = 0;
break;
}
}
else if (map[stoneY][stoneX] == 0)
break;
}
if (valid) {
for (int i = 0; i < stoneCount; i++) {
map[y][stoneX-i] = map[y][stoneX - i - 1];
}
energy -= cost;
map[y][x] = 0;
x++;
map[y][x] = energy;
}
}
}
else if (instruction == 2) {
if (y < n - 1) {
int stoneX = x, stoneY = y + 1, valid = 1, cost = 0, stoneCount = 0;
while (valid) {
if (cost > energy) {
valid = 0;
break;
}
if (stoneY >= n - 1 && map[stoneY][stoneX] != 0) {
valid = 0;
break;
}
if (stoneY < n - 1 && map[stoneY][stoneX] != 0) {
if (energy - cost >= map[stoneY][stoneX]) {
cost += map[stoneY][stoneX];
stoneY++;
stoneCount++;
}
else {
valid = 0;
break;
}
}
else if (map[stoneY][stoneX] == 0)
break;
}
if (valid) {
for (int i = 0; i < stoneCount; i++) {
map[stoneY - i][stoneX] = map[stoneY - i - 1][stoneX];
}
energy -= cost;
map[y][x] = 0;
y++;
map[y][x] = energy;
}
}
}
else if (instruction == 3) {
if (x > 0) {
int stoneX = x - 1, stoneY = y, valid = 1, cost = 0, stoneCount = 0;
while (valid) {
if (cost > energy) {
valid = 0;
break;
}
if (stoneX <= 0 && map[stoneY][stoneX] != 0) {
valid = 0;
break;
}
if (stoneX > 0 && map[stoneY][stoneX] != 0) {
if (energy - cost >= map[stoneY][stoneX]) {
cost += map[stoneY][stoneX];
stoneX--;
stoneCount++;
}
else {
valid = 0;
break;
}
}
else if (map[stoneY][stoneX] == 0)
break;
}
if (valid) {
for (int i = 0; i < stoneCount; i++) {
map[y][stoneX + i] = map[y][stoneX + i + 1];
}
energy -= cost;
map[y][x] = 0;
x--;
map[y][x] = energy;
}
}
}
else {
if (y > 0) {
int stoneX = x, stoneY = y - 1, valid = 1, cost = 0, stoneCount = 0;
while (valid) {
if (cost > energy) {
valid = 0;
break;
}
if (stoneY <= 0 && map[stoneY][stoneX] != 0) {
valid = 0;
break;
}
if (stoneY > 0 && map[stoneY][stoneX] != 0) {
if (energy - cost >= map[stoneY][stoneX]) {
cost += map[stoneY][stoneX];
stoneY--;
stoneCount++;
}
else {
valid = 0;
break;
}
}
else if (map[stoneY][stoneX] == 0)
break;
}
if (valid) {
for (int i = 0; i < stoneCount; i++) {
map[stoneY + i][stoneX] = map[stoneY + i + 1][stoneX];
}
energy -= cost;
map[y][x] = 0;
y--;
map[y][x] = energy;
}
}
}
}
return 0;
}
```
### Jugde Girl 50085. Tank Simulation
```clike
#include <stdio.h>
int main() {
int n, m, l, w, o;
scanf("%d%d%d%d%d ", &n, &m, &l, &w, &o);
int map[n][m];
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
map[i][j] = 0;
for (int i = 0; i < o; i++) {
int x, y;
scanf("%d%d", &x, &y);
map[y][x] = 2;
}
int x = 0, y = 0;
for (int i = 0; i < l; i++)
for (int j = 0; j < w; j++)
map[y+i][x+j] = 1;
int instruction;
while (scanf("%d", &instruction) == 1) {
if (instruction == 0) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
printf("%d", map[i][j]);
printf("\n");
}
continue;
}
int obstacleCount = 0;
if (instruction == 1) {
if (x + w - 1 < m - 1) {
for (int i = 0; i < l; i++)
if (map[y+i][x+w] == 2)
obstacleCount++;
if (obstacleCount <= 1) {
for (int i = 0; i < l; i++) {
map[y+i][x] = 0;
map[y+i][x+w] = 1;
}
x++;
}
}
}
else if (instruction == 2) {
if (y + l - 1 < n - 1) {
for (int i = 0; i < w; i++)
if (map[y+l][x+i] == 2)
obstacleCount++;
if (obstacleCount <= 1) {
for (int i = 0; i < w; i++) {
map[y][x+i] = 0;
map[y+l][x+i] = 1;
}
y++;
}
}
}
else if (instruction == 3) {
if (x > 0) {
for (int i = 0; i < l; i++)
if (map[y+i][x-1] == 2)
obstacleCount++;
if (obstacleCount <= 1) {
for (int i = 0; i < l; i++) {
map[y+i][x+w-1] = 0;
map[y+i][x-1] = 1;
}
x--;
}
}
}
else if (instruction == 4) {
if (y > 0) {
for (int i = 0; i < w; i++)
if (map[y-1][x+i] == 2)
obstacleCount++;
if (obstacleCount <= 1) {
for (int i = 0; i < w; i++) {
map[y+l-1][x+i] = 0;
map[y-1][x+i] = 1;
}
y--;
}
}
}
else {
if ((x + w - 1 < m - 1) && (y + l - 1 < n - 1)) {
for (int i = 1; i < l; i++)
if (map[y+i][x+w] == 2)
obstacleCount++;
for (int i = 1; i < w; i++)
if (map[y+l][x+i] == 2)
obstacleCount++;
if (map[y+l][x+w] == 2)
obstacleCount++;
if (obstacleCount <= 1) {
map[x][y] = 0;
for (int i = 0; i < w; i++) {
map[y][x+i] = 0;
map[y+l][x+i+1] = 1;
}
for (int i = 0; i < l; i++) {
map[y+i][x] = 0;
map[y+i+1][x+w] = 1;
}
x++, y++;
}
}
}
}
return 0;
}
```
習題 5
---
### Judge Girl 50086. Students and Party
```clike
#include <stdio.h>
#define k 256
#define max_n 32768
int friends[max_n][k];
int invited[max_n] = {0};
int main() {
int N, E, ID1, ID2;
scanf("%d%d", &N, &E); // read
for (int i = 0; i < max_n; i++)
for (int j = 0; j < k; j++)
friends[i][j] = -1;
while (E--) {
int x = 0; int y = 0;
scanf("%d", &ID1);
while (friends[ID1][x] != -1) // x means the nth friend of student1
x++;
scanf("%d", &friends[ID1][x]);// student2 is a friend of student1
ID2 = friends[ID1][x];
while (friends[ID2][y] != -1) // y means the nth friend of student2
y++;
friends[ID2][y] = ID1; // student1 is a friend of student2
}
int party;// party means the student who is planning for the party
while (scanf("%d", &party) == 1) {
invited[party] = 1; // party planner is attending the party as well
for (int i = 0; i < k; i++) //inviting all his friends
invited[friends[party][i]] = 1;
}
for (int i = 0; i < N; i++)
if (invited[i] == 0)
printf("%d\n", i); // print ID if the student is not invited
return 0;
}
```
### Judge Girl 50087. See-Saw
```clike
#include <stdio.h>
int main(void) {
int n, a[2048], Mleft = 0, Mright = 0, step1 = 0;
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d", &a[i]);
for(int i = 1; i < n - 1; i++) {
Mleft = Mright = 0;
for(int j = 0; j < i; j++)
Mleft += a[j] * (i - j);
for(int k = i + 1; k < n; k++)
Mright += a[k] * (k - i);
if(Mleft == Mright) {
step1 = 1;
for(int l = 0 ; l < i; l++)
printf("%d ", a[l]);
printf("v ");
for(int l = i + 1; l < n - 1; l++)
printf("%d ", a[l]);
printf("%d\n", a[n-1]);
break;
}
}
if(step1 == 0) {
for(int m = 0; m < n; m++) {
int temp = a[m];
a[m] = a[n-m-1];
a[n-m-1] = temp;
for(int i = 1; i < n - 1; i++) {
Mleft = Mright = 0;
for(int j = 0; j < i; j++)
Mleft += a[j] * (i - j);
for(int k = i + 1; k < n; k++)
Mright += a[k] * (k - i);
if(Mleft == Mright) {
for(int l = 0 ; l < i; l++)
printf("%d ", a[l]);
printf("v ");
for(int l = i + 1; l < n - 1; l++)
printf("%d ", a[l]);
printf("%d\n", a[n-1]);
return 0;
}
}
}
}
}
```
### Judge Girl 50122. Knights’ Tour
```clike
#include <stdio.h>
int board[128][128];
int valid(int row, int column, int n) {
if (row > n - 1 || column > n - 1)
return 0;
else if (row < 0 || column < 0)
return 0;
else if (board[row][column] == 1)
return 0;
return 1;
}
int main() {
int dx[9] = {0, -2, -1, 1, 2, 2, 1, -1, -2}; // right : +, left : -
int dy[9] = {0, 1, 2, 2, 1, -1, -2, -2, -1}; // down : +, up : -
int n, m;
scanf("%d%d", &n, &m);
int knights[m + 1][2], output[128][128] = {0};
for (int i = 1; i <= m; i++) {
int row, column;
scanf("%d%d", &row, &column);
knights[i][0] = row, knights[i][1] = column;
board[row][column] = 1;
output[row][column] = 10000 * i;
}
int stopped[m];
for (int i = 1; i <= m; i++)
stopped[i] = 0;
int keepGoing = 1, turn = 1;
while (keepGoing) {
for (int i = 1; i <= m; i++) {
int decision = -1, pMin = 10000000;
for (int j = 1; j <= 8; j++) {
int nextRow = knights[i][0] + dx[j];
int nextColumn = knights[i][1] + dy[j];
if (!valid(nextRow, nextColumn, n))
continue;
int p = 0;
for (int k = 1; k <= 8; k++)
if (valid(nextRow + dx[k], nextColumn + dy[k], n))
p++;
if (p < pMin) {
pMin = p;
decision = j;
}
}
if (decision == -1)
stopped[i] = 1;
else {
knights[i][0] += dx[decision];
knights[i][1] += dy[decision];
board[knights[i][0]][knights[i][1]] = 1;
output[knights[i][0]][knights[i][1]] = 10000 * i + turn;
}
}
int end = 1;
for (int i = 1; i <= m; i++)
if (!stopped[i]) {
end = 0;
break;
}
if (end)
keepGoing = 0;
turn++;
}
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
printf("%d%c", output[i][j], j == n - 1? '\n' : ' ');
return 0;
}
```
### Judge Girl 50123. Magic Square
```clike
#include <stdio.h>
int grid[1000][1000];
int main() {
int n, k, r, c;
scanf("%d%d%d%d", &n, &k, &r, &c);
int back = k, backR = r, backC = c;
while (back >= 1) {
grid[backR][backC] = back;
backR = (backR + 1) % n, backC = (backC - 1 + n) % n;
back--;
}
while (k <= n * n) {
grid[r][c] = k;
int nextR = (r - 1 + n) % n, nextC = (c + 1 + n) % n;
if (grid[nextR][nextC] != 0) {
nextR = (r + 1) % n, nextC = c;
}
r = nextR, c = nextC;
k++;
}
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
printf("%d%c", grid[i][j], (j == n - 1)? '\n' : ' ');
return 0;
}
```
### Codeforces. Doors Breaking and Repairing
```math.h```已經有內建的ceiling function了~
```clike
#include <stdio.h>
#include <math.h>
int main() {
int n, x, y;
scanf("%d%d%d", &n, &x, &y);
int durability[n];
for (int i = 0; i < n; i++)
scanf("%d", &durability[i]);
double count = 0;
int destroyed = 0;
if (x <= y) {
for (int i = 0; i < n; i++) {
if (durability[i] <= x)
count++;
}
destroyed = ceil(count / 2);
}
else {
destroyed = n;
}
printf("%d\n", destroyed);
return 0;
}
```
## 習題 6
### Judge Girl 50088. Mountain Travelers
```clike
int visited[1024][1024] = {0};
int dr[8] = {0, 0, 1, -1, 1, -1, -1, 1};
int dc[8] = {1, -1, 0, 0, 1, -1, 1, -1};
int in_map(int N, int M, int r, int c) {
return r >= 0 && r <= N - 1 && c >= 0 && c <= M - 1;
}
void travel(int map[1024][1024], int N, int M, int A_r, int A_c, int B_r, int B_c, int directionA[], int directionB[]) {
visited[A_r][A_c] = visited[B_r][B_c] = 1;
int A_stop = 0, B_stop = 0, A_steps = 0, B_steps = 0;
while (!A_stop || !B_stop) {
// choose which cell the travelers should go
int A_steepest = 0, A_decision = -1, B_steepest = 0, B_decision = -1;
for (int i = 0; !A_stop && i < 8; i++) {
int new_r = A_r + dr[i], new_c = A_c + dc[i];
if (in_map(N, M, new_r, new_c)) {
if (map[new_r][new_c] - map[A_r][A_c] > A_steepest) {
A_steepest = map[new_r][new_c] - map[A_r][A_c];
A_decision = i;
}
}
}
for (int i = 0; !B_stop && i < 8; i++) {
int new_r = B_r + dr[i], new_c = B_c + dc[i];
if (in_map(N, M, new_r, new_c)) {
if (map[B_r][B_c] - map[new_r][new_c] > B_steepest) {
B_steepest = map[B_r][B_c] - map[new_r][new_c];
B_decision = i;
}
}
}
// the travelers now move into the new cell
if (!A_stop && A_decision != -1) {
directionA[A_steps] = A_decision;
A_steps++;
A_r += dr[A_decision], A_c += dc[A_decision];
}
if (!B_stop && B_decision != -1) {
directionB[B_steps] = B_decision;
B_steps++;
B_r += dr[B_decision], B_c += dc[B_decision];
}
// if the travelers can't find a suitable cell
if (A_decision == -1) A_stop = 1;
if (B_decision == -1) B_stop = 1;
// if they go into same cell
if (A_r == B_r && A_c == B_c) A_stop = B_stop = 1;
// if they go into cell that has been visited
// (note that the traveler will never go into cells that has been visited by themselves
// since the height is monotonically increasing/decreasing)
if (visited[A_r][A_c]) A_stop = 1;
if (visited[B_r][B_c]) B_stop = 1;
if (A_stop) directionA[A_steps] = -1;
if (B_stop) directionB[B_steps] = -1;
visited[A_r][A_c] = 1;
visited[B_r][B_c] = 1;
}
}
```
### Judge Girl 50124. Knights' Tour with Functions
main.c
```clike
#include <stdio.h>
#include "validMoveNum.h"
#include "nextMove.h"
int main() {
int n, m;
scanf("%d%d", &n, &m);
int visited[100][100] = {0}, output[100][100] = {0};
int knights[m + 1][2];
for (int i = 1; i <= m; i++) {
scanf("%d%d", &knights[i][0], &knights[i][1]);
visited[knights[i][0]][knights[i][1]] = 1;
output[knights[i][0]][knights[i][1]] = i * 10000;
}
int move[8][2] = {{-2, 1}, {-1, 2}, {1, 2}, {2, 1}, {2, -1}, {1, -2}, {-1, -2}, {-2, -1}};
int keepGoing = 1, turn = 1, stopped[m + 1];
for (int i = 1; i <= m; i++)
stopped[i] = 0;
while (keepGoing) {
for (int i = 1; i <= m; i++) {
if (stopped[i])
continue;
int decision = nextMove(knights[i][0], knights[i][1], n, visited);
if (decision == -1)
stopped[i] = 1;
else {
knights[i][0] += move[decision][0];
knights[i][1] += move[decision][1];
visited[knights[i][0]][knights[i][1]] = 1;
output[knights[i][0]][knights[i][1]] = 10000 * i + turn;
}
}
int end = 1;
for (int i = 1; i <= m; i++)
if (!stopped[i]) {
end = 0;
break;
}
if (end)
keepGoing = 0;
turn++;
}
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
printf("%d%c", output[i][j], j == n - 1 ? '\n' : ' ');
return 0;
}
```
validMoveNum.c
```clike
int validMoveNum(int r, int c, int n, int visited[100][100]) {
if (r < 0 || r > n - 1 || c < 0 || c > n - 1)
return -1;
if (visited[r][c])
return -1;
int move[8][2] = {{ -2, 1}, { -1, 2}, {1, 2}, {2, 1}, {2, -1}, {1, -2}, { -1, -2}, { -2, -1}};
int num = 0;
for (int i = 0; i < 8; i++) {
int nextR = r + move[i][0], nextC = c + move[i][1];
if (nextR < 0 || nextR > n - 1 || nextC < 0 || nextC > n - 1)
continue;
if (!visited[nextR][nextC])
num++;
}
return num;
}
```
nextMove.c
```clike
#include "validMoveNum.h"
int nextMove(int r, int c, int n, int visited[100][100]) {
int decision = -1, pMin = 1000000;
int move[8][2] = {{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1}};
for (int i = 0; i < 8; i++) {
int p = validMoveNum(r + move[i][0], c + move[i][1], n, visited);
if (p == -1) continue;
if (p < pMin) {
pMin = p;
decision = i;
}
}
return decision;
}
```
### Judge Girl 50125. Consecutive 1’s with Function
main.c
```clike
#include <stdio.h>
#include "findLength.h"
int main() {
int n;
scanf("%d", &n);
int array[256][256] = {0};
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
scanf("%d", &array[i][j]);
int direction[4][2] = {{1,0}, {1,1}, {0,1}, {-1,1}};
int max = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
for (int k = 0; k < 4; k++) {
int length = findLength(array, n, i, j, direction[k][0], direction[k][1]);
if (length > max)
max = length;
}
printf("%d\n", max);
return 0;
}
```
findLength.c
```clike
int findLength(int array[][256], int N, int r, int c, int dr, int dc) {
int length = 0, max = 0;
for (int i = r, j = c; i < N && j < N && i >= 0 && j >= 0; i += dr, j += dc) {
if (array[i][j] == 1) {
length++;
if (length > max) max = length;
}
else
length = 0;
}
return max;
}
```
## 習題 7
### Judge Girl 50128. Split a List
```clike
#include <stdlib.h>
void split(int A[], int *a[], int *head[], int k) {
int sizeA = 0;
while (a[sizeA] != NULL)
sizeA++;
sizeA++;
for (int i = 0; i < sizeA; i++)
a[i] = NULL;
int tail[k];
for (int i = 0; i < k; i++)
tail[i] = -1;
for (int i = 0; i < sizeA; i++) {
int remainder = A[i] % k;
if (tail[remainder] == -1)
head[remainder] = &A[i];
else
a[tail[remainder]] = &A[i];
tail[remainder] = i;
}
}
```
### Judge Girl 50129. Loops
```clike
int findLoop(int N, int *A, int index, int *B[], int *max, int *min, int visited[])
{
int start = *max = *min = A[index];
int i = index;
visited[index] = 1;
int length = 1;
while (*B[i] != start) {
i = B[i] - A;
visited[i] = 1;
if (A[i] > *max)
*max = A[i];
if (A[i] < *min)
*min = A[i];
length++;
}
return length;
}
void loops(int N, int *A, int *B[], int ans[4])
{
int visited[N];
for (int i = 0; i < N; i++)
visited[i] = 0;
int max, min;
int maxLength = 0;
int minLength = N + 1;
int maxMax, minMin;
for (int i = 0; i < N; i++)
if (visited[i] == 0) {
int length = findLoop(N, A, i, B, &max, &min, visited);
if (length > maxLength) {
maxLength = length;
maxMax = max;
} else if (length == maxLength && max > maxMax)
maxMax = max;
if (length < minLength) {
minLength = length;
minMin = min;
} else if (length == minLength && min < minMin)
minMin = min;
}
ans[0] = maxLength;
ans[1] = minLength;
ans[2] = maxMax;
ans[3] = minMin;
}
```
### Judge Girl 50090. Count Pointers
```clike
#include "count.h"
#include <stdlib.h>
#include <stdio.h>
#define MAXN 512
static int cmp_addr(const void *x, const void *y) {
int *a = *(int **) x, *b = *(int **) y;
if (a < b) return -1;
if (a == b) return 0;
return 1;
}
static int cmp_ret(const void *x, const void *y) {
int *a = (int *) x, *b = (int *) y;
if (a[1] != b[1])
return a[1] < b[1] ? -1 : 1;
return a[0] < b[0] ? -1 : 1;
}
void count(int **p[]) {
int *A[MAXN], n = 0;
for (; p[0]; p++)
A[n] = *p[0], n++;
qsort(A, n, sizeof(int*), cmp_addr);
int B[MAXN][2], m = 0;
for (int i = 0; i < n; ) {
int cnt = 0, j = i;
while (j < n && A[i] == A[j])
j++, cnt++;
B[m][0] = *A[i], B[m][1] = cnt, m++;
i = j;
}
qsort(B, m, sizeof(int)*2, cmp_ret);
for (int i = 0; i < m; i++)
printf("%d %d\n", B[i][0], B[i][1]);
}
```
### Judge Girl 50091. Two-level Table
```clike
#include <stdio.h>
#include <stdlib.h>
int **firstPtr[100];
int *secondPtr[1000000];
int ***constructTable(int A[], int B[]) {
int i = 0, j = 0, k = 0;
while (A[i] != 0) {
firstPtr[i] = &secondPtr[j];
for (int x = 0; x < A[i]; x++) {
secondPtr[j] = &B[k];
while (B[k] != 0)
k++;
k++;
j++;
}
secondPtr[j] = NULL;
j++;
i++;
}
firstPtr[i] = NULL;
return firstPtr;
}
```