Форум: "Прочее";
Текущий архив: 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