Advertisement
melnikovmaxim

KLENINA_queen

Dec 16th, 2019
335
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 8.55 KB | None | 0 0
  1. //link https://yadi.sk/d/F8DalqfUIoDQ9w
  2. {Дана шахматная доска 8х8, на которой стоят ферзи, каждый ферзь может бить по вертикали
  3. горизонтали и диагоналям,
  4. нужно перебрать максимальное количество вариантов не бьющих друг друга ферзей.
  5. каждая вертиакаль пронумерована от 1 до 8
  6. и на каждой вертикали, горизонтали и диагонали }
  7. {флажок в false, как попадется одинаковый, то true(while)}
  8.  
  9. program fn;
  10.  
  11. uses
  12.   graphabc;
  13.  
  14. var
  15.   a1: array of byte := (1, 1, 1, 1, 1, 1, 1, 1, 1);
  16.   mm3, mm4: array[1..8] of byte;
  17.   m: array[1..100] of array [1..100] of integer;    // Из программы закраска матрицы                                        // Из программы закраска матрицы
  18.   i,  j, ax, ay, ymax, xmax: integer;// Из программы закраска матрицы
  19.  
  20. procedure fill(x, y: integer);// Процедура из программы закраска матрицы
  21. var
  22.   x1, x2, y1, y2, r: integer;
  23. begin
  24.   begin
  25.     if (x >= 1) and (y >= 1) and (x <= xmax) and (y <= ymax) then
  26.     begin
  27.       x1 := ay * y;
  28.       y1 := ax * x;
  29.       x2 := x1 + ax;
  30.       y2 := y1 + ay;
  31.       if m[x, y] = 1 then
  32.       begin
  33.         setbrushcolor(clblack);
  34.         Rectangle(x1, y1, x2, y2);
  35.       end;
  36.       if m[x, y] = 0 then
  37.       begin
  38.         setbrushcolor(clwhite);
  39.         Rectangle(x1, y1, x2, y2);
  40.       end;
  41.       if m[x, y] = 2 then
  42.       begin
  43.         if (x mod 2 = 0) and (y mod 2 = 1) then
  44.         begin
  45.           setbrushcolor(clblack);
  46.           Rectangle(x1, y1, x2, y2);
  47.         end;
  48.         if (x mod 2 = 1) and (x mod y = 0) then
  49.         begin
  50.           setbrushcolor(clblack);
  51.           Rectangle(x1, y1, x2, y2);
  52.         end;
  53.         if (x mod 2 = 1) and (y mod 2 = 1) then
  54.         begin
  55.           setbrushcolor(clwhite);
  56.           Rectangle(x1, y1, x2, y2);
  57.         end;
  58.         if (x mod 2 = 0) and (y mod 2 = 0) then
  59.         begin
  60.           setbrushcolor(clwhite);
  61.           Rectangle(x1, y1, x2, y2);
  62.         end;
  63.         setbrushcolor(clblack);
  64.         if ((x mod 2 = 1) and (y mod 2 = 1) or (x mod 2 = 0) and (y mod 2 = 0)) then
  65.         begin
  66.           setbrushcolor(clblack);
  67.           for r := 1 to 7 do
  68.             line(x1 + 5 + 1 + 5, y1 + 52 - r, x2 - 5 - 1 - 5, y1 + 52 - r, clblack);
  69.           for r := 1 to 2 do
  70.             line(x1 + 5 + 5, y1 + 46 - r, x2 - 5 - 5, y1 + 46 - r, clblack);
  71.           for r := 1 to 2 do
  72.             line(x1 + 4 + 5, y1 + 44 - r, x2 - 4 - 5, y1 + 44 - r, clblack);
  73.           //1 слева корона
  74.           for r := 1 to 4 do
  75.             line(x1 + 10 + r, y1 + 42, x1 + 7, y1 + 28, clblack);
  76.           circle(x1 + 7, y1 + 28, 3);
  77.           //2
  78.           for r := 1 to 5 do
  79.             line(x1 + 18 + r, y1 + 41, x1 + 5 + 9 + 4, y1 + 20, clblack);
  80.           circle(x1 + 5 + 9 + 4, y1 + 17, 3);
  81.           //3
  82.           for r := 1 to 4 do
  83.             line(x2 - 10 - r, y1 + 42, x2 - 7, y1 + 28, clblack);
  84.           circle(x2 - 5 - 2, y1 + 28, 3);
  85.           //4
  86.           for r := 1 to 5 do
  87.             line(x2 - 18 - r, y1 + 41, x2 - 5 - 9 - 4, y1 + 20, clblack);
  88.           circle(x2 - 5 - 9 - 4, y1 + 17, 3);
  89.           //5
  90.           for r := 1 to 3 do
  91.             line(x2 - 30 - r, y1 + 41, x2 - 30, y1 + 10, clblack);
  92.           for r := 0 to 3 do
  93.             line(x2 - 30 + r, y1 + 41, x2 - 30, y1 + 10, clblack);
  94.           circle(x2 - 30, y1 + 7, 3);
  95.         end
  96.         else
  97.         begin
  98.           setbrushcolor(clwhite);
  99.           for r := 1 to 7 do
  100.             line(x1 + 5 + 1 + 5, y1 + 52 - r, x2 - 5 - 1 - 5, y1 + 52 - r, clwhite);
  101.           for r := 1 to 2 do
  102.             line(x1 + 5 + 5, y1 + 46 - r, x2 - 5 - 5, y1 + 46 - r, clwhite);
  103.           for r := 1 to 2 do
  104.             line(x1 + 4 + 5, y1 + 44 - r, x2 - 4 - 5, y1 + 44 - r, clwhite);
  105.           //1 слева корона
  106.           for r := 1 to 4 do
  107.             line(x1 + 10 + r, y1 + 42, x1 + 7, y1 + 28, clwhite);
  108.           circle(x1 + 7, y1 + 28, 3);
  109.           //2
  110.           for r := 1 to 5 do
  111.             line(x1 + 18 + r, y1 + 41, x1 + 5 + 9 + 4, y1 + 20, clwhite);
  112.           circle(x1 + 5 + 9 + 4, y1 + 17, 3);
  113.           //3
  114.           for r := 1 to 4 do
  115.             line(x2 - 10 - r, y1 + 42, x2 - 7, y1 + 28, clwhite);
  116.           circle(x2 - 5 - 2, y1 + 28, 3);
  117.           //4
  118.           for r := 1 to 5 do
  119.             line(x2 - 18 - r, y1 + 41, x2 - 5 - 9 - 4, y1 + 20, clwhite);
  120.           circle(x2 - 5 - 9 - 4, y1 + 17, 3);
  121.           //5
  122.           for r := 1 to 3 do
  123.             line(x2 - 30 - r, y1 + 41, x2 - 30, y1 + 10, clwhite);
  124.           for r := 0 to 3 do
  125.             line(x2 - 30 + r, y1 + 41, x2 - 30, y1 + 10, clwhite);
  126.           circle(x2 - 30, y1 + 7, 3);
  127.         end;
  128.       end;
  129.       if y < ymax then
  130.       begin
  131.         fill(x, y + 1);
  132.       end;
  133.       if (y = ymax) and (x < xmax) then
  134.       begin
  135.         fill(x + 1, y - y + 1);
  136.       end;
  137.     end;
  138.   end;
  139. end;
  140.  
  141. function prk(m1: array of byte): integer;
  142. var
  143.   ii, i4, i5, i6, i7, i8, hh: integer;
  144. begin
  145.   while (m1[8] <> 9) do
  146.   begin
  147.     if m1[8] < 8 then
  148.     begin
  149.       m1[8] := m1[8] + 1;
  150.       hh := 1;
  151.     end;
  152.     if m1[8] = 8 then
  153.       hh := 0;
  154.     if (m1[8] = 8) and (m1[6] < 8) and (hh = 0) then
  155.     begin
  156.       m1[6] := m1[6] + 1;
  157.       m1[8] := 1;
  158.     end;
  159.     if (m1[6] = 8) and (m1[8] = 8) and (m1[5] < 8)  then
  160.     begin
  161.       m1[5] := m1[5] + 1;
  162.       m1[6] := 1;
  163.       m1[8] := 1;
  164.     end;
  165.     if (m1[6] = 8) and (m1[8] = 8) and (m1[5] = 8) and (m1[4] < 8) then
  166.     begin
  167.       m1[4] := m1[4] + 1;
  168.       m1[6] := 1;
  169.       m1[8] := 1;
  170.       m1[5] := 1;
  171.     end;
  172.     if (m1[6] = 8) and (m1[8] = 8) and (m1[5] = 8) and (m1[4] = 8) and (m1[3] < 8) then
  173.     begin
  174.       m1[3] := m1[3] + 1;
  175.       m1[4] := 1;
  176.       m1[6] := 1;
  177.       m1[8] := 1;
  178.       m1[5] := 1;
  179.     end;
  180.     if (m1[6] = 8) and (m1[8] = 8) and (m1[5] = 8) and (m1[4] = 8) and (m1[3] = 8) and (m1[2] < 8) then
  181.     begin
  182.       m1[2] := m1[2] + 1;
  183.       m1[3] := 1;
  184.       m1[4] := 1;
  185.       m1[6] := 1;
  186.       m1[8] := 1;
  187.       m1[5] := 1;
  188.     end;
  189.     if (m1[6] = 8) and (m1[8] = 8) and (m1[5] = 8) and (m1[4] = 8) and (m1[3] = 8) and (m1[2] = 8) and (m1[1] < 8) then
  190.     begin
  191.       m1[1] := m1[1] + 1;
  192.       m1[2] := 1;
  193.       m1[3] := 1;
  194.       m1[4] := 1;
  195.       m1[6] := 1;
  196.       m1[8] := 1;
  197.       m1[5] := 1;
  198.     end;
  199.     if (m1[6] = 8) and (m1[8] = 8) and (m1[5] = 8) and (m1[4] = 8) and (m1[3] = 8) and (m1[1] = 8) and (m1[2] = 8) and (m1[1] < 8) then
  200.     begin
  201.       m1[1] := m1[1] + 1;
  202.       m1[2] := 1;
  203.       m1[3] := 1;
  204.       m1[4] := 1;
  205.       m1[6] := 1;
  206.       m1[8] := 1;
  207.       m1[5] := 1;
  208.       m1[1] := 1;
  209.     end;
  210.     if (m1[6] = 8) and (m1[8] = 8) and (m1[5] = 8) and (m1[4] = 8) and (m1[3] = 8) and (m1[1] = 8) and (m1[2] = 8) and (m1[1] < 9) then
  211.     begin
  212.       m1[1] := m1[1] + 1;
  213.       m1[2] := 1;
  214.       m1[3] := 1;
  215.       m1[4] := 1;
  216.       m1[6] := 1;
  217.       m1[8] := 1;
  218.       m1[5] := 1;
  219.       m1[1] := 1;
  220.     end;
  221.     i7 := 1;
  222.     for i5 := 1 to 8 do
  223.       for i6 := 1 to 8 do
  224.       begin
  225.         if i6 <> i5 then
  226.           if (m1[i5] <> m1[i6]) and ((abs(m1[i6] - m1[i5]) <> abs(i6 - i5))) then
  227.             i7 := i7 * 1
  228.           else
  229.             i7 := i7 * 0;
  230.       end;
  231.     ii := 1;
  232.     if i7 = 1 then
  233.     begin
  234.       for i4 := 1 to 8 do
  235.       begin
  236.         if m1[1] <> 9 then
  237.         begin
  238.           if i4 = 8 then
  239.             i8 := 1;
  240.           if i4 = 7 then
  241.             i8 := 2;
  242.           if i4 = 6 then
  243.             i8 := 3;
  244.           if i4 = 5 then
  245.             i8 := 4;
  246.           if i4 = 4 then
  247.             i8 := 5;
  248.           if i4 = 3 then
  249.             i8 := 6;
  250.           if i4 = 2 then
  251.             i8 := 7;
  252.           if i4 = 1 then
  253.             i8 := 8;
  254.          
  255.           mm3[ii] := m[m1[i8], i8];
  256.           mm4[ii] := i8;
  257.           m[m1[i8], i8] := 2;
  258.           fill(i, j);
  259.           ii := ii + 1;
  260.         end;
  261.       end;
  262.       readln();
  263.       for ii := 1 to 8 do
  264.         m[m1[mm4[ii]], mm4[ii]] := mm3[ii];
  265.     end;
  266.    
  267.   end;
  268. end;
  269.  
  270. begin
  271.   ax := 60;
  272.   ay := 60;
  273.   for i := 1 to 8 do
  274.   begin
  275.     for j := 1 to 8 do
  276.     begin
  277.       if (i mod 2 = 0) and (j mod 2 = 1) then
  278.         m[i, j] := 1;
  279.       if (i mod 2 = 1) and (j mod 2 = 0) then
  280.         m[i, j] := 1;
  281.     end;
  282.   end;  
  283.   ymax := j;
  284.   xmax := i;
  285.   i := 1;
  286.   j := 1;
  287.   prk(a1);
  288. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement