Конференция "Прочее" » интересную задачку нашел
 
  • Vlad Oshin © (01.08.08 12:12) [0]
    матрица 8х8
    Заполнить против часовой стрелки по спирали вовнутрь.


    1 28 27 26 25 24 23 22
    2 29......................21
    3..........................20
    4..........................19
    5..........................18
    6..........................17
    7..........................16
    8 9 10 11 12 13 14 15



    нужно заполнить в один цикл
  • Rouse_ © (01.08.08 13:00) [1]
    Чет слишком простая... так и не понял в чем была сложность:

    program test;

    {$APPTYPE CONSOLE}

    uses
     Types,
     SysUtils;

    type
     TCursorDirectional = (cdDown, cdRight, cdUp, cdLeft);

    const
     CursorOffsets: array [TCursorDirectional] of TPoint =
       (
         (X: 0; Y: 1),
         (X: 1; Y: 0),
         (X: 0; Y: -1),
         (X: -1; Y: 0)
       );

    var
     Buff: array [0..7] of array [0..7] of Byte;
     I, Directional: Integer;
     Cursor, CursorOffset: TPoint;

     X, Y: Integer;
    begin
     // Инициализация (хотя можно и опустить, т.к. переменные глобальные)
     FillChar(Buff, 64, 0);
     Cursor := Point(0, 0);
     Directional := 0;
     CursorOffset := CursorOffsets[TCursorDirectional(Directional mod 4)];

     // заполнение в один цикл
     for I := 1 to 64 do
     begin
       Buff[Cursor.X, Cursor.Y] := I;
       if (Buff[Cursor.X + CursorOffset.X,
         Cursor.Y + CursorOffset.Y] <> 0) or
         (Cursor.X + CursorOffset.X > 7) or
         (Cursor.Y + CursorOffset.Y > 7) then
       begin
         Inc(Directional);
         CursorOffset := CursorOffsets[TCursorDirectional(Directional mod 4)];
       end;
       Inc(Cursor.X, CursorOffset.X);
       Inc(Cursor.Y, CursorOffset.Y);
     end;

     // вывод на экран
     for Y := 0 to 7 do
     begin
       for X := 0 to 6 do
         Write(Format('%.2d, ', [Buff[X, Y]]));
       Writeln(Format('%.2d, ', [Buff[7, Y]]));
     end;
     Readln;
    end.

  • Zeqfreed © (01.08.08 13:14) [2]
    #include <stdio.h>
    #include <stdlib.h>

    #define DOWN 0
    #define RIGHT 1
    #define UP 2
    #define LEFT 3

    #define W 8
    #define H 8

    struct Pad {
    int top;
    int right;
    int bottom;
    int left;
    }
    pad = {0, 0, 0, 0};

    int x = 0, y = 0;
    int dir = DOWN;

    int move()
    {
    switch (dir) {
     case DOWN:
      y++;
      if (y == H - pad.bottom) {
       y--;
       x++;
       pad.left++;
       dir = RIGHT;
      }

      break;

     case RIGHT:
      x++;
      if (x == W - pad.right) {
       x--;
       y--;
       pad.bottom++;
       dir = UP;
      }

      break;
     case UP:
      y--;
      if (y < pad.top) {
       y++;
       x--;
       pad.right++;
       dir = LEFT;
      }

      break;
     case LEFT:
      x--;
      if (x < pad.left) {
       x++;
       y++;
       pad.top++;
       dir = DOWN;
      }

      break;
    }
    }

    int main()
    {
    int table[W][H] = {0}
    ;

    int i = 2;
    table[0][0] = 1;

    while (i <= W*H) {
     move();
     table[x][y] = i++;
    }


    int j;
    for (j = 0; j < H; j++) {
     for (i = 0; i < W; i++) {
      printf("%02d ", table[i][j]);
     }

     puts("");
    }

    return 0;
    }



    Альтернативная реализация :)
  • Dimka Maslov © (01.08.08 13:39) [3]
    А слабо вывести на экран за один цикл на экран вывести
  • Rouse_ © (01.08.08 13:45) [4]

    > А слабо вывести на экран за один цикл на экран вывести

    Раза 4 перечитал:)))

     // вывод на экран
     for I := 0 to 63 do
       if (I + 1) mod 8 = 0 then
         Writeln(Format('%.2d', [Buff[I mod 8, I div 8]]))
       else
         Write(Format('%.2d, ', [Buff[I mod 8, I div 8]]));

  • oldman © (01.08.08 14:05) [5]

    > нужно заполнить в один цикл


    var
    три массива: m1(координата по Х), m2(координата по Y), m3(вносимое число)

    for i:=1 to 64 do матрица(m1[i],m2[i]):=m3[i]

    :)))
  • @!!ex © (01.08.08 14:06) [6]
    Это классическая задачка с Тимуса...
    Нам препод на первом курсе, в конце первого семестра сказал:
    Вот есть задачки, принесете листинг решения на экзамен будет плюс...
    Я ступил... Вместо того, чтобы решит ьодну задачу, решил все и принес ему...
    Он посмотрел, поставил автомат и выгнал. :)
 
Конференция "Прочее" » интересную задачку нашел
Есть новые Нет новых   [134439   +51][b:0][p:0.003]