Главная страница
    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.008 c
15-1217338253
проходил мимо решил зайти
2008-07-29 17:30
2008.09.21
QReport


15-1217504410
Правильный$Вася
2008-07-31 15:40
2008.09.21
как перевести на английский


2-1218506684
Abcdef123
2008-08-12 06:04
2008.09.21
Проблемы перевода проекта с Delphi6 на Delphi 2007


4-1196879411
EgorovAlex
2007-12-05 21:30
2008.09.21
Утечка ресурсов


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