queen.c 921 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. int printf();
  2. void *calloc();
  3. int atoi();
  4. int Q;
  5. int N;
  6. int **t;
  7. print() {
  8. int x;
  9. int y;
  10. for (y=0; y<Q; y++) {
  11. for (x=0; x<Q; x++)
  12. if (t[x][y])
  13. printf(" Q");
  14. else
  15. printf(" .");
  16. printf("\n");
  17. }
  18. printf("\n");
  19. }
  20. chk(int x, int y) {
  21. int i;
  22. int r;
  23. for (r=i=0; i<Q; i++) {
  24. r = r + t[x][i];
  25. r = r + t[i][y];
  26. if (x+i < Q & y+i < Q)
  27. r = r + t[x+i][y+i];
  28. if (x+i < Q & y-i >= 0)
  29. r = r + t[x+i][y-i];
  30. if (x-i >= 0 & y+i < Q)
  31. r = r + t[x-i][y+i];
  32. if (x-i >= 0 & y-i >= 0)
  33. r = r + t[x-i][y-i];
  34. }
  35. return r;
  36. }
  37. go(int y) {
  38. int x;
  39. if (y == Q) {
  40. print();
  41. N++;
  42. return 0;
  43. }
  44. for (x=0; x<Q; x++)
  45. if (chk(x, y) == 0) {
  46. t[x][y]++;
  47. go(y+1);
  48. t[x][y]--;
  49. }
  50. }
  51. main(int ac, void **av) {
  52. int i;
  53. Q = 8;
  54. if (ac >= 2)
  55. Q = atoi(av[1]);
  56. t = calloc(Q, sizeof(int *));
  57. for (i=0; i<Q; i++)
  58. t[i] = calloc(Q, sizeof(int));
  59. go(0);
  60. printf("found %d solutions\n", N);
  61. }