Форум программистов, компьютерный форум, киберфорум
Наши страницы

C для начинающих

Войти
Регистрация
Восстановить пароль
 
vernon
2 / 2 / 0
Регистрация: 15.01.2014
Сообщений: 50
#1

Олимпиадная задача. Занумеровать клетки исходного квадрата по правилу - C (СИ)

25.04.2014, 16:24. Просмотров 612. Ответов 1
Метки нет (Все метки)

Олимпиадная задача
Квадрат разбит на 4k одинаковых квадратных клеток.
Квадрат перегибается поочередно относительно вертикальной (правая половина накладывается на левую)
и горизонтальной (нижняя половина подкладывается под верхнюю) оси симметрии до тех пор,
пока все клетки не будут расположены одна под другой.
Занумеровать клетки исходного квадрата таким образом,
чтобы после выполнения перегибов номера клеток в полученном столбике
шли по возрастанию сверху вниз от 1 до 4k . Нумерация вручную не пройдет!

Интерфейс программы:
входные данные:
k – показатель степени (от единицы до десяти),
выходные данные:
вид квадрата с номерами клеток.
Пример
Вход
k=1
Выход – квадрат с четырьмя клетками:
4 3
1 2
1
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.04.2014, 16:24
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Олимпиадная задача. Занумеровать клетки исходного квадрата по правилу (C (СИ)):

Составить из исходного массива новый по правилу - C (СИ)
Дан массив A N<=10. Нужно составить из исходного массива новый, где числа будут числами - сумма цифр из исходного массива в десятичной...

Из исходного массива сформировать новый по правилу - C (СИ)
Из элементов массива А размерностью n>10 сформируйте массив В той же размерности следующим образом: если номер четный, то B:=A* A, если...

Олимпиадная задача по информатике 1997 год - C (СИ)
Доброго времени суток. Попалась олимпиадная задача по информатике за 97 год. Возьмем клетчатую доску MxN (1<=M,N<=4). Воткнем в...

Занумеровать клетки исходного квадрата следующим образом - C++
Помогите кто сможет!! Задали реализовать задачу на с++.А с чего начать просто не понимаю.В плюсах я конечно не спец,но в такой задачи я...

Олимпиадная задача - Pascal
На вход в файле INPUT.TXT подаётся две строчки: N - количество томов(максимум 32) и (от 1 до N)порядок томов книг Нужно найти и вывести...

Олимпиадная задача - C++
Есть такая задачка: В ряд выписаны числа, состоящие только из цифр 1, 3, 7: 1, 3, 7, 11, 13, 17, ... Необходимо по номеру N определить...

1
gng
686 / 532 / 141
Регистрация: 08.09.2013
Сообщений: 1,413
26.04.2014, 07:58 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Решение "в лоб". Подойдет, если нет ограничений на память.
Для каждой клетки постоянно хранятся нач. и кон. значения диапозона.
C
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
26
27
28
29
30
31
32
33
#include <stdio.h>
#include <math.h>
 
int b[1000][1000], e[1000][1000];
 
bend (size) {
  if (b[0][0] == e[0][0]) return;
 
  int i, j;
  for (i= 0; i < size; i++) for (j= 0; j < size; j++) {
    e[2*size-i-1][j]= b[i][j];
    b[2*size-i-1][j]= b[i][j] + (e[i][j] - b[i][j])/2;
    b[i][j]= e[i][j] + (b[i][j]-e[i][j])/2;
  }
  for (i= 0; i < size*2; i++) for (j= 0; j < size; j++) {
    e[i][2*size-j-1]= b[i][j];
    b[i][2*size-j-1]= b[i][j] + (e[i][j] - b[i][j])/2;
    b[i][j]= e[i][j] + (b[i][j]-e[i][j])/2;
  }
  bend (size * 2);
}
 
main() {
  int k, i, j, size= 1;
  scanf ("%d", &k);
  b[0][0]= 1;
  e[0][0]= powl (4, k);
  bend( size );
  for (i=0; i < powl (2,k); i++) {
    for (j= 0; j < powl (2,k); j++) printf ("%d\t", b[i][j]);
    printf ("\n");
  }
}
Добавлено через 8 часов 4 минуты
Немного "причесал" код
C
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
#include <stdio.h>
#include <math.h>
 
int last[1024][1024];
 
bend (int size) {
  int i, j;
  int width= last[0][0] / (size*size*4);
  for (i= 0; i < size; i++) for (j= 0; j < size; j++) {
    int fl= (i+j) % 2 * 2 - 1; // 1 or -1
    last[2*size-i-1][j]= last[i][j] + fl*(width * 4 - 1);
    last[i][2*size-j-1]= last[i][j] + fl*(width * 2 -1);
    last[2*size-i-1][2*size-j-1]= last[i][j] + fl*(width * 2 );
  }
}
 
main() {
  int k, i, j, size;
  scanf ("%d", &k);
  last[0][0]= powl (4, k);
  for (size= 1; size < powl (2,k); size*= 2) bend (size);
  for (i=0; i < size; i++) {
    for (j= 0; j < size; j++) printf ("%d\t", last[i][j]);
    printf ("\n");
  }
}
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.04.2014, 07:58
Привет! Вот еще темы с ответами:

Олимпиадная задача - Delphi
Доброго времени суток. Я иду на городскую олимпиаду по информатике. Естественно, там будут задачи по программированию. Я в этом...

Олимпиадная задача - Turbo Pascal
Дана задача: Перевести десятизначное число n в двузначное, и циклически сдвигать его вправо, до тех пор, пока не получится максимальное из...

Олимпиадная задача - Turbo Pascal
какое число ввел пользователь, если ответом является число 100 var a: array of integer; i:integer; sum: integer; begin ...

Олимпиадная задача - Механика
Маленький мальчик, плывя с родителями вверх по речке, отпустил кораблик. После этого они прошли еще вверх 15 мин и сделали 30 мин....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru