Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.09.21;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.006 c
2-1218446900
REX2008
2008-08-11 13:28
2008.09.21
Подключение звукового файла


11-1193561717
files32
2007-10-28 11:55
2008.09.21
Русский язык KOL+Lazarus+WinCE


1-1198507695
312kbps
2007-12-24 17:48
2008.09.21
Control has no parent window


2-1218362895
mokmoc
2008-08-10 14:08
2008.09.21
TStatusBar, размер TStatusPanel


3-1206026929
tytus
2008-03-20 18:28
2008.09.21
Select from ( функция которая возвращает строку) /10g





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский