Advertisement
Guest User

Untitled

a guest
Jul 23rd, 2019
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.13 KB | None | 0 0
  1. /* Queens.c Vincent Cheng viwcheng CMPS 12B 7/18/19 finds solution to N queens problem from 1<=n<=15*/
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5.  
  6. void placeQueen(int** B, int n, int i, int j) {
  7. B[i][j]++; // i is row, j is column
  8. B[i][0] = j;
  9. for (int k = 1; k <= n; k++) {
  10. if (j + k <= n) {
  11. B[i][j + k]--;
  12. if (i - k > 0) {
  13. B[i - k][j + k]--;
  14. }
  15. if (i + k <= n) {
  16. B[i + k][j + k]--;
  17. }
  18. }
  19. }
  20. }
  21. void removeQueen(int** B, int n, int i, int j) {
  22. B[i][j]--;
  23. B[i][0] = 0;
  24. for (int k = 1; k <= n; k++) {
  25. if (j + k <= n) {
  26. B[i][j + k]++;
  27. if (i - k > 0) {
  28. B[i - k][j + k]++;
  29. }
  30. if (i + k <= n) {
  31. B[i + k][j + k]++;
  32. }
  33. }
  34. }
  35. }
  36. void printBoard(int** B, int n) {
  37. /* char* listOfColumns = malloc(n*sizeof(char));
  38. for (int i = 0; i < n; i++)
  39. {
  40. listOfColumns[i]=B[i][0];
  41. }
  42. char* str = malloc(n*sizeof(char));*/
  43. //str[0] = "{";
  44. printf("(");
  45. for (int k = 1; k <= n; k++) {
  46. if (k < n) {
  47. /*str[k]=listOfColumns[k];
  48. str[k+1]=", ";*/
  49. printf("%d, ", B[k][0]);
  50. } else {
  51. /*str[k]=listOfColumns[k];
  52. str[k+1]=")\n";*/
  53. printf("%d", B[k][0]);
  54.  
  55. }
  56. }
  57. //printf(str);
  58. printf(")\n");
  59. }
  60. int findSolutions(int** B, int n, int i, char* mode) {
  61. int sum = 0;
  62. if (i > n) {
  63. if (strcmp(mode,"verbose")==0) {
  64. printBoard(B, n);
  65. }
  66. return 1;
  67. } else {
  68. for (int j = 1; j <= n; j++) {
  69. if (B[j][i] == 0) // j is row, i is column
  70. {
  71. placeQueen(B, n, j, i);
  72. sum += findSolutions(B, n, i + 1, mode);
  73. removeQueen(B, n, j, i);
  74. }
  75.  
  76. }
  77. }
  78. return sum;
  79. }
  80. int main(int argc, char* argv[]) {
  81. int n;
  82. char ch;
  83. if ((argc != 2) && (argc != 3)) {
  84. printf(
  85. "Usage: Queens [-v] number\nOption: -v verbose output, print all solutions\n");
  86. } else {
  87. if (argc==2 && strcmp(argv[1], "-v") == 0) {
  88. printf(
  89. "Usage: Queens [-v] number\nOption: -v verbose output, print all solutions\n");
  90. }
  91. else if (argc==3 && strcmp(argv[1], "-v") == 0)
  92. {
  93. sscanf(argv[2], "%d%c", &n, &ch);
  94. if ((n <= 0) || (n > 15)) {
  95. printf(
  96. "Usage: Queens [-v] number\nOption: -v verbose output, print all solutions\n");
  97. return EXIT_FAILURE;
  98. }
  99. int** arr = calloc(n + 1, sizeof(int*));
  100. for (int i = 0; i <= n; i++) {
  101. arr[i] = calloc(n + 1, sizeof(int));
  102. }
  103. if (n != 1) {
  104.  
  105. printf("%d-Queens has %d solutions\n", n,
  106. findSolutions(arr, n, 1, "verbose"));
  107. } else {
  108. printf("%d-Queens has %d solution\n", n,
  109. findSolutions(arr, n, 1, "verbose"));
  110. }
  111. for(int i = 0; i <= n; i++)
  112. {
  113. free(arr[i]);
  114. arr[i] = NULL;
  115. }
  116. free(arr);
  117. arr = NULL;
  118. } else {
  119. sscanf(argv[1], "%d%c", &n, &ch);
  120. if ((n <= 0) || (n > 15)) {
  121. printf(
  122. "Usage: Queens [-v] number\nOption: -v verbose output, print all solutions\n");
  123. return EXIT_FAILURE;
  124. }
  125. int** arr = calloc(n + 1, sizeof(int*));
  126. for (int i = 0; i <= n; i++) {
  127. arr[i] = calloc(n + 1, sizeof(int));
  128. }
  129. if (n != 1) {
  130. printf("%d-Queens has %d solutions\n", n,
  131. findSolutions(arr, n, 1, ""));
  132. } else {
  133. printf("%d-Queens has %d solution\n", n,
  134. findSolutions(arr, n, 1, ""));
  135. }
  136. for(int i = 0; i <= n; i++)
  137. {
  138. free(arr[i]);
  139. arr[i] = NULL;
  140. }
  141. free(arr);
  142. arr = NULL;
  143. }
  144. }
  145.  
  146.  
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement