Главная страница
    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
15-1217595436
stas
2008-08-01 16:57
2008.09.21
Вопрос знатокам C#


15-1217024688
Германн
2008-07-26 02:24
2008.09.21
Редактирование AVI с видеокамеры Panasonic


2-1217913860
lewka
2008-08-05 09:24
2008.09.21
Размер HTML- кода (трафик)


1-1198155538
андр
2007-12-20 15:58
2008.09.21
Передача параметров


2-1218115988
Дамир
2008-08-07 17:33
2008.09.21
Работа с окнами





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