Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.09.21;
Скачать: CL | DM;

Вниз

интересную задачку нашел   Найти похожие ветки 

 
Vlad Oshin ©   (2008-08-01 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_ ©   (2008-08-01 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 ©   (2008-08-01 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 ©   (2008-08-01 13:39) [3]

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


 
Rouse_ ©   (2008-08-01 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 ©   (2008-08-01 14:05) [5]


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


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

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

:)))


 
@!!ex ©   (2008-08-01 14:06) [6]

Это классическая задачка с Тимуса...
Нам препод на первом курсе, в конце первого семестра сказал:
Вот есть задачки, принесете листинг решения на экзамен будет плюс...
Я ступил... Вместо того, чтобы решит ьодну задачу, решил все и принес ему...
Он посмотрел, поставил автомат и выгнал. :)


 
Zeqfreed ©   (2008-08-01 14:13) [7]

Это даже задачкой трудно назвать :)


 
oldman ©   (2008-08-01 16:01) [8]


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


А зачем? В задании четко написано:


> матрица 8х8
> Заполнить против часовой стрелки по спирали вовнутрь.



Страницы: 1 вся ветка

Текущий архив: 2008.09.21;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
2-1218475782
Павлик
2008-08-11 21:29
2008.09.21
Количество записей в таблице


2-1218521158
Sergey2
2008-08-12 10:05
2008.09.21
Доступ к базе по локальной сети через IP


15-1217415402
Vlad Oshin
2008-07-30 14:56
2008.09.21
Скорее по администрированию. Как заставить ОС память всю есть?


15-1217196828
DesWind
2008-07-28 02:13
2008.09.21
Поздравляю наш доблесный военно-морской Российский Флот!!!


2-1218546905
Павлик
2008-08-12 17:15
2008.09.21
Сортировка по возростанию