Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Магический квадрат

Автор: Muffin 2.12.2007 23:40

Привет вам дорогие форумчане. Не могли бы вы помочь мне с одной програмкой. Програмка та ещё,на уровне фантастики. Вот само описание: дается квадрат с где k номер каждой ячейки... за определенное конечное колическтво шагов необходимо просчитать где перемещаемая точка быть не может, она не может двигаться по диагонали, и при этом при каждом шаге должно быть так чтобы точке было куда двигаться, за некоторое колическтво ходов по несколько шагов, точка должна остаться только в одном месте, которое и должна выдавать программа, гдt на выходе должна быть матрца квадрата, а ячейка в которой остается точка должна принимать значение истина. Компилятор Visual Basic Studio 6.0
P.S. Заранее огромное вам спасибо))))

Автор: Michael_Rybak 3.12.2007 18:32

Совершенно бессвязное условие, как по мне.

Пойми сама, что нужно сделать, сформулируй четко, начни кодить, и приходи с конкретными вопросами - что не работает, как пробовала.

Автор: klem4 3.12.2007 21:49

я вот тоже ничего не понял ...

ps

Цитата
как пробовал.


Цитата
Пол: Женский
Реальное имя: Наталья


smile.gif

Автор: Michael_Rybak 3.12.2007 23:04

Цитата(klem4 @ 3.12.2007 16:49) *

ps


Упс smile.gif Пасиб, исправил smile.gif

Автор: Muffin 4.12.2007 1:23

слушайте, ребят, если я девочка это не значит что я тупая или ничего в VB не понимаю просто я написала так как объяснял мне препод. ок. попробую еще раз, вам дается квадрат разбитый на сектора. дается начальная точка откуда объект начнет двигаться по секторам. задается определенное колическтво шагов за один ход например 3... программа должна определить в каких клетках объект точно не может находится... затем делается еще один такой ход так же с колическтвом шагов... затем прграмма определяет где не может быть объет. таким образом за конечное количество ходов можно определить где объект будет находится когда ходов уже не останется.... нельзя ходить по диагонали и нужно чтобы оставалась возможность последующего хода

Автор: klem4 4.12.2007 1:40

Ну вот теперь более понятно. Очень интересная задачка. VB к сожалению не владею, но могу попробовать реализовать алгоритм на Pascal например, и если получится выложу. Ну а ты уже на VB переведешь ...

Автор: Michael_Rybak 4.12.2007 4:05

Цитата
слушайте, ребят, если я девочка это не значит что я тупая или ничего в VB не понимаю


Протестую. То, что я мальчик, тоже не значит, что я тупой. И в VB я что-то понимаю. Причем тут твой пол? Просто сравни свои первый и второй посты. Первый - на мой взгляд бессвязный, второй - нет. Только и всего. Не обижайся. (А про женский пол Клем писал, потому что я случайно окончания мужские поставил, когда к тебе обращался).

По задаче. Эта формулировка все еще не до конца понятная, но речь, видимо, идет о следующем "фокусе":

Коперфильд предлагает выбрать на доске число. Затем он называет число шагов и просит мысленно сделать один ход. Затем он зачеркивает часть клеток - не все, в которых не может сейчас быть точка, а только некоторые. Затем опять просит сделать ход, и опять вычеркивает, и так далее. После каждого шага множество клеток, в которые вам остается мысленно передвигать свою точку, все время уменьшается, и в конце остается одна, в которую он победоносно тычет своим псевдомагическим пальцем.

Единственная проблема - решить, какую часть клеток, в которых точки не может быть, мы будем вычеркивать. Несложно убедиться, что необходимо и достаточно всегда оставлять множество невычеркнутых клеток связным.

Действительно, если мы разделим это множество на два (и в каждом из них потенциально могла быть точка в момент разделения), мы никогда не узнаем, в какой "островок" попала точка.

Если же клетки оставлять связными, рано или поздно мы оставим две, а потом и одну клетку.

Проще всего сделать "в лоб": для каждой клетки, в которой объект сейчас быть не может, проверяем, останется ли поле связным, если ее вычеркнуть. Если да - вычеркиваем. Еще можно добавить случайность какую-то, а то при маленьком количестве ходов в шаге сразу всё поле вычеркнется.

Теперь рассказывай, что из этого ты понимаешь как делать, а что - нет.


Автор: Гость 5.12.2007 1:35

Пасиба.... аж приятно стало за такой ответ, серьезно
Спасибо за то что понял про какой фокус я говорю, потому что я явно объясняю не лучше всех в мире чего хочу))
А из всего этого я принцип понимаю, но как именно программу написат понять не могу....

Автор: Muffin 5.12.2007 1:37

это я была, тока войти забыла)

Автор: Michael_Rybak 5.12.2007 1:51

Тогда давай начинать с простого.

Насколько я понимаю, от тебя требуется не только алгоритм, но и графический интерфейс.

Кнопки можно сделать реально кнопками, а можно нарисовать самому. Если размер поля известен заранее, проще первое. Если нет - второе.

Для начала давай сделаем поле 4х6.

Напиши программу, которая выводит поле с пронумерованными кнопками, сообщает юзеру номер начальной кнопки (случайное число от 1 до 24), потом сообщает количество ходов в одном шаге (пусть будет 3), ждет пять секунд, и потом удаляет (делает невидимыми) *все* кнопки. Вот такой первый шаг. Сможешь?

Автор: Muffin 5.12.2007 21:42

а там не должен быть строгоквадрат, там 3 на 3 или 6 на 6...... а так я не понимаю алгоритма по котрому вычеркиваются ячейки в которых не может быть объект

Автор: Michael_Rybak 6.12.2007 21:46

Алгоритм примерно такой. Мысленно переносим всё это на шахматную доску. Зафиксируем количество шагов в ходе, пусть будет 6, например.

Пусть изначально у нас точка на черной клетке. Тогда понятно, что после каждого хода она сможет оказаться только на черной клетке (потому что 6 - четное число, а цвет клетки меняется после каждого шага). Таким образом, мы все время "обрезаем" все белые клетки по краям оставшейся (необрезанной) части поля, с тем, чтобы участок все время оставался связным (т.е. не было островков).

Если же количество шагов в ходе нечетно - все то же самое, но цвет клеток, в которых может быть точка, меняется на противоположный после каждого хода.

В целом, так.

Цвет клетки (x, y) можно определять так:

Код
if (x + y) mod 2 = 0 then
  ' черная
  ...
else
  ' белая
  ...
end if


Автор: Muffin 6.12.2007 23:50

ок
в результате программа должна выдать матруцу k11 k12 k13....k1n
k21 k22 k23....k2n
k31 k32 k33....k3n
в которой ячейке с объектом будем присваиваться значение true

Автор: Michael_Rybak 6.12.2007 23:57

скорее, программа должна последовательно выводить эту матрицу после каждого хода.

т.е. структура программы у тебя будет такая:

1. объявили матрицу
2. заполнили всё значениями true
3. задали и вывели юзеру координаты точки
4. вывели количество шагов в ходе.
5. начинаем цикл:
6. выводим матрицу
7. просим юзера мысленно сделать ход
8. проходим по матрице. если для клетки выполняются три условия - "1. клетка еще не вычеркнута (значение в матрице равно true), 2. точка не может сейчас быть в этой клетке и 3. у клетки не больше трех невычеркнутых соседей", вычеркиваем клетку (заменяем значение в матрице на false)
9. цикл продолжаем до тех пор, пока после вычеркивания очередной клетки не окажется, что осталась всего одна невычеркнутая клетка.
10. выводим конечную матрицу.