Peaceful chess queen armies: Difference between revisions
Content added Content deleted
Line 54: | Line 54: | ||
* [https://oeis.org/A250000 A250000] OEIS |
* [https://oeis.org/A250000 A250000] OEIS |
||
<br><br> |
<br><br> |
||
=={{header|C}}== |
|||
{{trans|C#}} |
|||
<lang c>#include <math.h> |
|||
#include <stdbool.h> |
|||
#include <stdio.h> |
|||
#include <stdlib.h> |
|||
enum Piece { |
|||
Empty, |
|||
Black, |
|||
White, |
|||
}; |
|||
typedef struct Position_t { |
|||
int x, y; |
|||
} Position; |
|||
/////////////////////////////////////////////// |
|||
struct Node_t { |
|||
Position pos; |
|||
struct Node_t *next; |
|||
}; |
|||
void releaseNode(struct Node_t *head) { |
|||
if (head == NULL) return; |
|||
releaseNode(head->next); |
|||
head->next = NULL; |
|||
free(head); |
|||
} |
|||
typedef struct List_t { |
|||
struct Node_t *head; |
|||
struct Node_t *tail; |
|||
size_t length; |
|||
} List; |
|||
List makeList() { |
|||
return (List) { NULL, NULL, 0 }; |
|||
} |
|||
void releaseList(List *lst) { |
|||
if (lst == NULL) return; |
|||
releaseNode(lst->head); |
|||
lst->head = NULL; |
|||
lst->tail = NULL; |
|||
} |
|||
void addNode(List *lst, Position pos) { |
|||
struct Node_t *newNode; |
|||
if (lst == NULL) { |
|||
exit(EXIT_FAILURE); |
|||
} |
|||
newNode = malloc(sizeof(struct Node_t)); |
|||
if (newNode == NULL) { |
|||
exit(EXIT_FAILURE); |
|||
} |
|||
newNode->next = NULL; |
|||
newNode->pos = pos; |
|||
if (lst->head == NULL) { |
|||
lst->head = lst->tail = newNode; |
|||
} else { |
|||
lst->tail->next = newNode; |
|||
lst->tail = newNode; |
|||
} |
|||
lst->length++; |
|||
} |
|||
void removeAt(List *lst, size_t pos) { |
|||
if (lst == NULL) return; |
|||
if (pos == 0) { |
|||
struct Node_t *temp = lst->head; |
|||
if (lst->tail == lst->head) { |
|||
lst->tail = NULL; |
|||
} |
|||
lst->head = lst->head->next; |
|||
temp->next = NULL; |
|||
free(temp); |
|||
lst->length--; |
|||
} else { |
|||
struct Node_t *temp = lst->head; |
|||
struct Node_t *rem; |
|||
size_t i = pos; |
|||
while (i-- > 1) { |
|||
temp = temp->next; |
|||
} |
|||
rem = temp->next; |
|||
if (rem == lst->tail) { |
|||
lst->tail = temp; |
|||
} |
|||
temp->next = rem->next; |
|||
rem->next = NULL; |
|||
free(rem); |
|||
lst->length--; |
|||
} |
|||
} |
|||
/////////////////////////////////////////////// |
|||
bool isAttacking(Position queen, Position pos) { |
|||
return queen.x == pos.x |
|||
|| queen.y == pos.y |
|||
|| abs(queen.x - pos.x) == abs(queen.y - pos.y); |
|||
} |
|||
bool place(int m, int n, List *pBlackQueens, List *pWhiteQueens) { |
|||
struct Node_t *queenNode; |
|||
bool placingBlack = true; |
|||
int i, j; |
|||
if (pBlackQueens == NULL || pWhiteQueens == NULL) { |
|||
exit(EXIT_FAILURE); |
|||
} |
|||
if (m == 0) return true; |
|||
for (i = 0; i < n; i++) { |
|||
for (j = 0; j < n; j++) { |
|||
Position pos = { i, j }; |
|||
queenNode = pBlackQueens->head; |
|||
while (queenNode != NULL) { |
|||
if ((queenNode->pos.x == pos.x && queenNode->pos.y == pos.y) || !placingBlack && isAttacking(queenNode->pos, pos)) { |
|||
goto inner; |
|||
} |
|||
queenNode = queenNode->next; |
|||
} |
|||
queenNode = pWhiteQueens->head; |
|||
while (queenNode != NULL) { |
|||
if ((queenNode->pos.x == pos.x && queenNode->pos.y == pos.y) || placingBlack && isAttacking(queenNode->pos, pos)) { |
|||
goto inner; |
|||
} |
|||
queenNode = queenNode->next; |
|||
} |
|||
if (placingBlack) { |
|||
addNode(pBlackQueens, pos); |
|||
placingBlack = false; |
|||
} else { |
|||
addNode(pWhiteQueens, pos); |
|||
if (place(m - 1, n, pBlackQueens, pWhiteQueens)) { |
|||
return true; |
|||
} |
|||
removeAt(pBlackQueens, pBlackQueens->length - 1); |
|||
removeAt(pWhiteQueens, pWhiteQueens->length - 1); |
|||
placingBlack = true; |
|||
} |
|||
inner: {} |
|||
} |
|||
} |
|||
if (!placingBlack) { |
|||
removeAt(pBlackQueens, pBlackQueens->length - 1); |
|||
} |
|||
return false; |
|||
} |
|||
void printBoard(int n, List *pBlackQueens, List *pWhiteQueens) { |
|||
size_t length = n * n; |
|||
struct Node_t *queenNode; |
|||
char *board; |
|||
size_t i, j, k; |
|||
if (pBlackQueens == NULL || pWhiteQueens == NULL) { |
|||
exit(EXIT_FAILURE); |
|||
} |
|||
board = calloc(length, sizeof(char)); |
|||
if (board == NULL) { |
|||
exit(EXIT_FAILURE); |
|||
} |
|||
queenNode = pBlackQueens->head; |
|||
while (queenNode != NULL) { |
|||
board[queenNode->pos.x * n + queenNode->pos.y] = Black; |
|||
queenNode = queenNode->next; |
|||
} |
|||
queenNode = pWhiteQueens->head; |
|||
while (queenNode != NULL) { |
|||
board[queenNode->pos.x * n + queenNode->pos.y] = White; |
|||
queenNode = queenNode->next; |
|||
} |
|||
for (i = 0; i < length; i++) { |
|||
if (i != 0 && i % n == 0) { |
|||
printf("\n"); |
|||
} |
|||
switch (board[i]) { |
|||
case Black: |
|||
printf("B "); |
|||
break; |
|||
case White: |
|||
printf("W "); |
|||
break; |
|||
default: |
|||
j = i / n; |
|||
k = i - j * n; |
|||
if (j % 2 == k % 2) { |
|||
printf(" "); |
|||
} else { |
|||
printf("# "); |
|||
} |
|||
break; |
|||
} |
|||
} |
|||
printf("\n\n"); |
|||
} |
|||
void test(int n, int q) { |
|||
List blackQueens = makeList(); |
|||
List whiteQueens = makeList(); |
|||
printf("%d black and %d white queens on a %d x %d board:\n", q, q, n, n); |
|||
if (place(q, n, &blackQueens, &whiteQueens)) { |
|||
printBoard(n, &blackQueens, &whiteQueens); |
|||
} else { |
|||
printf("No solution exists.\n\n"); |
|||
} |
|||
releaseList(&blackQueens); |
|||
releaseList(&whiteQueens); |
|||
} |
|||
int main() { |
|||
test(2, 1); |
|||
test(3, 1); |
|||
test(3, 2); |
|||
test(4, 1); |
|||
test(4, 2); |
|||
test(4, 3); |
|||
test(5, 1); |
|||
test(5, 2); |
|||
test(5, 3); |
|||
test(5, 4); |
|||
test(5, 5); |
|||
test(6, 1); |
|||
test(6, 2); |
|||
test(6, 3); |
|||
test(6, 4); |
|||
test(6, 5); |
|||
test(6, 6); |
|||
test(7, 1); |
|||
test(7, 2); |
|||
test(7, 3); |
|||
test(7, 4); |
|||
test(7, 5); |
|||
test(7, 6); |
|||
test(7, 7); |
|||
return EXIT_SUCCESS; |
|||
}</lang> |
|||
{{out}} |
|||
<pre>1 black and 1 white queens on a 2 x 2 board: |
|||
No solution exists. |
|||
1 black and 1 white queens on a 3 x 3 board: |
|||
B # |
|||
# W |
|||
# |
|||
2 black and 2 white queens on a 3 x 3 board: |
|||
No solution exists. |
|||
1 black and 1 white queens on a 4 x 4 board: |
|||
B # # |
|||
# W |
|||
# # |
|||
# # |
|||
2 black and 2 white queens on a 4 x 4 board: |
|||
B # # |
|||
# W |
|||
B # # |
|||
# W |
|||
3 black and 3 white queens on a 4 x 4 board: |
|||
No solution exists. |
|||
1 black and 1 white queens on a 5 x 5 board: |
|||
B # # |
|||
# W # |
|||
# # |
|||
# # # |
|||
# # |
|||
2 black and 2 white queens on a 5 x 5 board: |
|||
B # # B |
|||
# W # |
|||
W # |
|||
# # # |
|||
# # |
|||
3 black and 3 white queens on a 5 x 5 board: |
|||
B # # B |
|||
# W # |
|||
W # |
|||
# # B # |
|||
W # |
|||
4 black and 4 white queens on a 5 x 5 board: |
|||
B B |
|||
# # B |
|||
W # W # |
|||
# # B |
|||
W # W # |
|||
5 black and 5 white queens on a 5 x 5 board: |
|||
No solution exists. |
|||
1 black and 1 white queens on a 6 x 6 board: |
|||
B # # # |
|||
# W # |
|||
# # # |
|||
# # # |
|||
# # # |
|||
# # # |
|||
2 black and 2 white queens on a 6 x 6 board: |
|||
B # # B # |
|||
# W # |
|||
W # # |
|||
# # # |
|||
# # # |
|||
# # # |
|||
3 black and 3 white queens on a 6 x 6 board: |
|||
B # # B B |
|||
# W # |
|||
W # # |
|||
# # # |
|||
# W # # |
|||
# # # |
|||
4 black and 4 white queens on a 6 x 6 board: |
|||
B # # B B |
|||
# W # |
|||
W # # |
|||
# # # B |
|||
# W W # |
|||
# # # |
|||
5 black and 5 white queens on a 6 x 6 board: |
|||
B # B # |
|||
# # B # B |
|||
W # # # |
|||
W W # |
|||
# # B |
|||
W W # |
|||
6 black and 6 white queens on a 6 x 6 board: |
|||
No solution exists. |
|||
1 black and 1 white queens on a 7 x 7 board: |
|||
B # # # |
|||
# W # # |
|||
# # # |
|||
# # # # |
|||
# # # |
|||
# # # # |
|||
# # # |
|||
2 black and 2 white queens on a 7 x 7 board: |
|||
B # # B # |
|||
# W # W |
|||
# # # |
|||
# # # # |
|||
# # # |
|||
# # # # |
|||
# # # |
|||
3 black and 3 white queens on a 7 x 7 board: |
|||
B # # B # |
|||
# W # W |
|||
B # # # |
|||
# W # # |
|||
# # # |
|||
# # # # |
|||
# # # |
|||
4 black and 4 white queens on a 7 x 7 board: |
|||
B # # B # |
|||
# W # W |
|||
B # # B # |
|||
# W # W |
|||
# # # |
|||
# # # # |
|||
# # # |
|||
5 black and 5 white queens on a 7 x 7 board: |
|||
B # # B # |
|||
# W # W |
|||
B # # B # |
|||
# W # W |
|||
B # # # |
|||
# W # # |
|||
# # # |
|||
6 black and 6 white queens on a 7 x 7 board: |
|||
B # # B # |
|||
# W # W |
|||
B # # B # |
|||
# W # W |
|||
B # # B # |
|||
# W # W |
|||
# # # |
|||
7 black and 7 white queens on a 7 x 7 board: |
|||
B # B |
|||
# B # B # |
|||
B # B |
|||
# # B # |
|||
W # W # # W |
|||
# # W # # |
|||
W # W W #</pre> |
|||
=={{header|C#|C sharp}}== |
=={{header|C#|C sharp}}== |