Главная страница
    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.47 MB
Время: 0.006 c
2-1218563976
RoPs
2008-08-12 21:59
2008.09.21
Про Tray


15-1216559287
Германн
2008-07-20 17:08
2008.09.21
Отправка почты


2-1218300547
Putnik
2008-08-09 20:49
2008.09.21
Сохранение массива в БД MS Access


15-1217578343
Vlad Oshin
2008-08-01 12:12
2008.09.21
интересную задачку нашел


11-1193554558
files32
2007-10-28 09:55
2008.09.21
RTTI или как его там в KOL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский