queens.mod 908 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. MODULE queen;
  2. FROM InOut IMPORT WriteString, WriteLn;
  3. TYPE row = ARRAY[1..8] OF INTEGER;
  4. VAR maxpos: INTEGER;
  5. d: row;
  6. PROCEDURE free(i,j: INTEGER): BOOLEAN;
  7. VAR k: INTEGER;
  8. BEGIN
  9. FOR k := 1 TO i-1 DO
  10. IF (d[k]=j) OR (j-d[k]=i-k) OR (d[k]-j=i-k) THEN
  11. RETURN FALSE;
  12. END;
  13. END;
  14. RETURN TRUE;
  15. END free;
  16. PROCEDURE print;
  17. VAR i,j: INTEGER;
  18. BEGIN
  19. FOR j := maxpos TO 1 BY -1 DO
  20. FOR i := 1 TO maxpos DO
  21. IF d[i] = j THEN
  22. WriteString("D ");
  23. ELSE
  24. WriteString(". ");
  25. END;
  26. END;
  27. WriteLn;
  28. END;
  29. WriteLn;
  30. END print;
  31. PROCEDURE queen(k: INTEGER);
  32. VAR i: INTEGER;
  33. BEGIN
  34. IF k = maxpos THEN
  35. FOR i := 1 TO maxpos DO
  36. IF free(k,i) THEN
  37. d[k] := i;
  38. print();
  39. END;
  40. END;
  41. ELSE
  42. FOR i := 1 TO maxpos DO
  43. IF free(k,i) THEN
  44. d[k] := i;
  45. queen(k+1);
  46. END;
  47. END;
  48. END;
  49. END queen;
  50. BEGIN
  51. maxpos := 8;
  52. queen(1);
  53. END queen.