uses crt;
var
a:array[1..10000,1..2] of integer;
i,n:integer;
{---------------------------------------------------------------------------}
procedure chet;
var
j,k:integer;
begin
k:=n*n div 2;
for j:=1 to k do begin
a[j,2]:=((j-1) div (n div 2))+1;
a[n*n-j+1,2]:=a[j,2];
end;
end;
{---------------------------------------------------------------------------}
procedure vivod;
var
j,k:integer;
begin
writeln;
for j:=1 to n do begin
for k:=1 to n*n do
if a[k,2]=j then write(a[k,1],' ');
writeln;
end;
end;
{---------------------------------------------------------------------------}
Procedure nechet;
var
j,k,nom:integer;
begin
for j:=1 to n do a[1+(n+1)*(j-1),2]:=1;
for j:=2 to n do begin
nom:=n+2-j;
for k:=1 to n-1 do begin
a[nom,2]:=j;
if k+1=j then begin
inc(nom);
a[nom,2]:=j;
end;
nom:=nom+n+1;
end;
end;
end;
{---------------------------------------------------------------------------}
begin
clrscr;
write('Vvod n:');
readln(n);
writeln;
writeln(n,' grupp 4isel s summoj v gruppe=',(n*n*n+n) div 2);
for i:=1 to n*n do a[i,1]:=i;
if n mod 2=0 then chet else nechet;
vivod;
readkey;
end.
Действуем так: если n четное, то все просто-берем по n/2 числе с начала и с конца списка-и метим их еденицами. Из оставшихся берем таким же образом 4 числа и метим двойками и.т.д.
Пример при n=4
1 1 2 2 3 3 4 4 4 4 3 3 2 2 1 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Если n нечетное, то для начала метим еденицами числа 1, 1+(n+1), 1+(n+1)*2 и.т.д до n. Пример для n=5
1 1 1 1 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
группа 1 группа 2 группа 3 группа 4
Список разбивается на n-1 (в данном случае 4) группу незанятых чисел. Метим их следующим образом: числу, стоящему на 2 месте присваиваем номер n, следующее число с номером n будет стоять на n+1 позицию дальше. Продолжаем подобным образом до конца списка. Кроме того, если номер группы на каком-то шаге будет равен номеру метки+1 (в данном случае для 5 это произойдет на 4-м шаге, когда присвоим метку 5 числу 20), то следующему числу так же присваиваем текущую метку и дальше ведем отсчет от этого числа. Дальше числу под номером 3 присваиваем метку n-1 и действуем аналогично. Продолжаем, пока не выполним алгоритм для метки 2.
Задача готова))
Ответ редакции :
Слишком сложно.
Vapekreng
(27.06.09 ):
Блин, все пробелы убрались... во втором примере читать так:
1___________1_______________1_________________1_________________1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
___группа 1______группа 2__________группа 3__________группа 4
Vapekreng
ответил(а) Vapekreng (27.06.09 ):
Это просто издевательство...Предыдущий пост читать так :)
1___________1_______________1_________________1_________________1
1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_17_18_19_20_21_22_23_24_25
___группа 1______группа 2__________группа 3__________группа 4
DobermaN
(09.10.09 ):
Мой вариант:
int[,] mas = new int[n, n];
int n1 = n - 1;
for (int i = 0; i < n; i++)
{
int sum = i + 1;
for (int j = 0; j < n; j++)
{
if (j != 0)
{
sum += n + 1;
}
if (i != 0 && j == n1)
{
n1--;
sum -= n;
}
mas[i, j] = sum;
}
}
если mas вывести на экран, то получится
n = 5
1 7 13 19 25 = 65
2 8 14 20 21 = 65
3 9 15 16 22 = 65
4 10 11 17 23 = 65
5 6 12 18 24 = 65
Vapekreng
(19.10.09 ):
Сложно для вас? Программа проста до безобразия, а алгоритм за 10 минут школяры усвоили...
GoldenMan
(26.04.10 ):
program Project3;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
n,k,i,j,l,m:longint;
begin
readln(n);
m:=1;
for i:=1 to n do
begin write(i,' '); m:=i;
for j:=1 to n-1 do
begin
if m mod n = 0 then m:=m+1 else
m:=m+n+1;
write(m, ' ');
end; writeln;
end;
readln;
{ TODO -oUser -cConsole Main : Insert code here }
end.
Моя версия на дельфи
Иван
(31.08.19 ):
Результат тот же, что и у DobermaN, но
сделано одной формулой.
<?php
$n = isset($argv[1]) ? (int) $argv[1] : 5;
for ($i = 0; $i < $n; $i++) {
for ($j = 0; $j < $n; $j++) {
echo (1 + $j * $n + ($i + $j) % $n);
echo ($j === $n - 1) ? "\n" : " ";
}
}
Вариант для четного n.
Выводим парами из сдвоеных рядов.
<?php
$n = isset($argv[1]) ? (int) $argv[1] : 4;
$n = $n - $n % 2;
for ($i = 0; $i < $n; $i++) {
for ($j = 0; $j < $n / 2; $j++) {
echo (1 + 2 * $j * $n + $i);
echo " ";
echo (2 * ($j + 1) * $n - $i);
echo ($j === $n / 2 - 1) ? "\n" : " ";
}
}
Результат:
1 8 9 16
2 7 10 15
3 6 11 14
4 5 12 13