Hello All,
I was recently looking for problems online to practice my code writing. I came across this problem, and I thought others may like to try it. Here is the question: where can you place eight queens on a chess board such that none of them can take any of the others. I'd like to see how others did it. Post your solutions. Here is what I did.
main.c
pos_func.hCode:#include <stdio.h> #include <stdlib.h> #include "pos_func.h" int main() { queen_t queen_1, queen_2, queen_3, queen_4, queen_5, queen_6, queen_7, queen_8; int r1, r2, r3, r4, r5, r6, r7, r8, r9; bool_e stop = FALSE; srand(time(0)); long int iterations = 0; while(!stop) { iterations++; if ((iterations%100000 == 0)) printf("."); do { r1 = rand()%65; r2 = rand()%65; r3 = rand()%65; r4 = rand()%65; r5 = rand()%65; r6 = rand()%65; r7 = rand()%65; r8 = rand()%65; } while (r1 == r2 || r1 == r3 || r1 == r4 || r1 == r5 || r1 == r6 || r1 == r7 || r1 == r8 || r2 == r3 || r2 == r4 || r2 == r5 || r2 == r6 || r2 == r7 || r2 == r8 || r3 == r4 || r3 == r5 || r3 == r6 || r3 == r7 || r3 == r8 || r4 == r5 || r4 == r6 || r4 == r7 || r4 == r8 || r5 == r6 || r5 == r7 || r5 == r8 || r6 == r7 || r6 == r8 || r7 == r8 || !r1 || !r2 || !r3 || !r4 || !r5 || !r6 || !r7 || !r8); find_position(&queen_1, r1); find_position(&queen_2, r2); find_position(&queen_3, r3); find_position(&queen_4, r4); find_position(&queen_5, r5); find_position(&queen_6, r6); find_position(&queen_7, r7); find_position(&queen_8, r8); if (!take_one(&queen_1, &queen_2) && !take_one(&queen_1, &queen_3) && !take_one(&queen_1, &queen_4) && !take_one(&queen_2, &queen_3) && !take_one(&queen_2, &queen_4) && !take_one(&queen_3, &queen_4) && !take_one(&queen_5, &queen_1) && !take_one(&queen_5, &queen_2) && !take_one(&queen_5, &queen_3) && !take_one(&queen_5, &queen_4) && !take_one(&queen_6, &queen_1) && !take_one(&queen_6, &queen_2) && !take_one(&queen_6, &queen_3) && !take_one(&queen_6, &queen_4) && !take_one(&queen_6, &queen_5) && !take_one(&queen_7, &queen_1) && !take_one(&queen_7, &queen_2) && !take_one(&queen_7, &queen_3) && !take_one(&queen_7, &queen_4) && !take_one(&queen_7, &queen_5) && !take_one(&queen_7, &queen_6) && !take_one(&queen_8, &queen_1) && !take_one(&queen_8, &queen_2) && !take_one(&queen_8, &queen_3) && !take_one(&queen_8, &queen_4) && !take_one(&queen_8, &queen_5) && !take_one(&queen_8, &queen_6) && !take_one(&queen_8, &queen_7)) { stop = TRUE; printf("\nQueen 1 - Row %d - Column %d.\n",queen_1.row,queen_1.column); printf("Queen 2 - Row %d - Column %d.\n",queen_2.row,queen_2.column); printf("Queen 3 - Row %d - Column %d.\n",queen_3.row,queen_3.column); printf("Queen 4 - Row %d - Column %d.\n",queen_4.row,queen_4.column); printf("Queen 5 - Row %d - Column %d.\n",queen_5.row,queen_5.column); printf("Queen 6 - Row %d - Column %d.\n",queen_6.row,queen_6.column); printf("Queen 7 - Row %d - Column %d.\n",queen_7.row,queen_7.column); printf("Queen 8 - Row %d - Column %d.\n",queen_8.row,queen_8.column); printf("%d",iterations); } } }
pos_func.cCode:ifndef _POS_FUNC_H_ #define _POS_FUNC_H_ typedef enum { FALSE = 0, TRUE } bool_e; typedef struct { unsigned char row; unsigned char column; } queen_t; extern void find_position(queen_t *queen, unsigned char pos_num); extern bool_e same_row(queen_t *queen1, queen_t *queen2); extern bool_e same_column(queen_t *queen1, queen_t *queen2); extern bool_e same_diagonal(queen_t *queen1, queen_t *queen2); extern bool_e take_one(queen_t *queen1, queen_t *queen2); #endif // _POS_FUNC_H_
Enjoy!Code:#include "pos_func.h" void find_position(queen_t *queen, unsigned char pos_num) { if (!(pos_num % 8)) { queen->row = (pos_num / 8); queen->column = 8; } else { queen->row = (pos_num / 8) + 1; queen->column = pos_num % 8; } } bool_e same_row(queen_t *queen1, queen_t *queen2) { if (queen1->row == queen2->row) return TRUE; else return FALSE; } bool_e same_column(queen_t *queen1, queen_t *queen2) { if (queen1->column == queen2->column) return TRUE; else return FALSE; } bool_e same_diagonal(queen_t *queen1, queen_t *queen2) { if (queen1->column - queen2->column == queen1->row - queen2->row || queen2->column - queen1->column == queen2->row - queen1->row) return TRUE; else if (queen2->column - queen1->column == queen1->row - queen2->row || queen2->column - queen1->column == queen1->row - queen2->row) return TRUE; else return FALSE; } bool_e take_one(queen_t *queen1, queen_t *queen2) { return (same_row(queen1,queen2) || same_column(queen1,queen2) || same_diagonal(queen1,queen2)); }