Uses crt; Const n=100; X:array[0..3]of -1..1=(0,-1,0,1); Y:array[0..3]of -1..1=(-1,0,1,0); Type Mas=array[0..n,0..n]of Integer; var A:mas; B:array[0..n,0..n]of Boolean; m,p,col,rooms,indexX,indexY:integer; procedure Init(Z:string); Var f:text; i,j:integer; Begin z:='input.txt'; Assign(f,z); Reset(f); ReadLn(f,m,p); For i:=1 to m do begin For j:=1 to p do Read(f,A[i,j]); ReadLn(f); end; FillChar(B,SizeOf(B),true); For i:=1 to m do For j:=1 to p do B[i,j]:=false; Close(f); end;
function Degree2(i:integer):integer; var j,t:integer; begin t:=1; For j:=1 to i do t:=t*2; Degree2:=t; end;
Procedure Solve(i,j:integer); Var k:integer; begin k:=3; While k>=0 do begin If A[i,j]=1 then begin If not B[i+X[k],j+Y[k]] then begin Inc(col); B[i,j]:=true; Solve(i+X[k],j+Y[k]); B[i,j]:=False; end; end Else A[i,j]:=A[i,j]-Degree2(k); Dec(k); end; end; procedure Prosmotr; var i,j:integer; begin For i:=1 to m do For j:=1 to p do If A[i,j]=0 then B[i,j]:=True; end; begin clrscr; Init('A:museum.txt'); rooms:=0; For indexX:=1 to m do For indexY:=1 to p do If not B[indexX,indexY] Then begin col:=1; Inc(rooms); Solve(indexX,indexY); Write(Col,' '); Prosmotr; end; WriteLn; WriteLn(rooms); readkey; end.
в чем ошибка????? Может кто-нибудь исправить? Добавлено спустя 27 минут, 48 секунд Совмещение ломаных. Две ломаные построены по ребрам сеточной области с целочисленными координатами. Требуется составить алгоритм—программу проверки совпадения двух ломаных, составленных из отрезков, с точностью до параллельного переноса и поворота на 90°, 180°, 270°. Исходные данные — число отрезков ломаных и значения координат их концов — определяются в текстовом файле. Выходной файл результатов должен содержать признак 1, если ломаные совпадают, и 0 — в противном случае.
Пример файла исходных данных:
4 — количество отрезков первой ломаной
0 0 1 0 3 0 2 0 1 0 2 0 3 0 3 1
2 — количество отрезков второй ломаной
1 1 1 4 0 4 1 4
Пример файла результатов:
1 — ломаные совпадают.
Advanced member
Статус: Не в сети Регистрация: 23.10.2003 Откуда: Иркутск/Майкоп
SaveUS.X29 писал(а):
в чем ошибка???
1) Процедуре Init передается строка, которая никак в этой процедуре не используется. Программа, впрочем, может работать и так.
2)
Код:
If A[i,j]=1 then
Неправильно. Здесь должно проверяться (при помощи and), равен ли нулю бит A[i,j], соответствующий k-му направлению. Т.е. if A[i,j] and Degree2(k) = 0 then
3)
Код:
Else A[i,j]:=A[i,j]-Degree2(k);
Внутри процедуры Solve почему-то изменяются значения элементов массива A, в котором записано расположение стен. 4)
Код:
B[i,j]:=true;
Должно выполняться в начале рекурсивной процедуры.
Код:
B[i,j]:=False;
Эта строка не нужна. Из-за нее процедура Solve вместо того, чтобы закрашивать все клетки, в которые можно попасть из начальной, вообще не изменяет состояние массива В.
_________________ Края каждого совершенно нового крышка процессора не на 100% гладкая. Это связано с тем, что следов мастерства не избежать. (c) Али.
Последний раз редактировалось vor 29.12.2008 6:24, всего редактировалось 1 раз.
Member
Статус: Не в сети Регистрация: 12.12.2005 Откуда: Москва
есть пару заданий в которых нужна помощь,кто может помогите плиз )
Упростите логическое выражение или укажите его результат (при его однозначности).
(not A or B) and (A or not B) and (A and B)
Упростите логическое выражение или укажите его результат (при его однозначности).
not ((A or B) → not (B or C))
Для какого символьного выражения будет ложным высказывание первая и вторая буквы гласные → not (четвертая буква согласная)? В ответе укажите номер выражения в списке.
REST
FAST
EAST
LAST
TASK
Найти логическую функцию F, зависящую от логических переменных A, B, C, по заданной таблице истинности. Упрощенный вид функции должен содержать не более трех логических операций. В упрощенном виде функции допустимо использовать только операции not, or и and.
A B C F
0 0 0 0
0 0 1 1
0 1 0 0
0 1 1 1
1 0 0 1
1 0 1 1
1 1 0 0
1 1 1 1
Хм, а в чем сложность? Вот ответы, но советую решить самому.
(1) A and B
(2) B or (A and C)
(3) EAST
(4) C or (A and (not B))
Надеюсь ничего не напутал.
Могу описать алгоритм, который, как я думаю, должен решать эту задачу, и все функции, кроме одной - поворот точки (отрезка) относительно начала координат на 90, 180 и 270 градусов (т.к. с геометрией у меня плоховато). Думаю это несложная функция для знающего геометрию.
Алгоритм такой:
(1) Читаем данные. Для этого удобно воспользоваться классом (или структурой) и сохранять не только координаты отрезков, а еще и их длины и направление (например, 0 - горизонтальный, 1 - вертикальный). Класс отрезка выглядит примерно так (на C#):
Код:
class Line{ public int y1, x1, y2, x2, length, direct; //0 - horiz, 1 - vert public Line(int y1, int x1, int y2, int x2){ this.y1 = y1; this.x1 = x1; this.y2 = y2; this.x2 = x2; CalcLength();} public void CalcLength(){ if (y2 == y1) { direct = 0; length = Math.Abs(x2 - x1); } else { direct = 1; length = Math.Abs(y2 - y1); }}}
Класс ломаной, соответственно, так (пока без доп. функций):
Код:
class PolyLine{ public int linesNb,yLength=0,xLength=0,xSum,ySum; public Line[] lines; public PolyLine(int linesNb) { this.linesNb = linesNb; lines = new Line[linesNb]; }}
(2) Теперь "нормализуем" каждую ломаную. Сначала Normalize1() - просто меняем точки, задающие отрезок так, чтобы первая была левее (ниже) второй. Это позволит упростить Normalize2() - которая "сливает" короткие отрезки в большие. Обе функции доб. в класс PolyLine:
Код:
public void Normalize1(){ int i,t; for(i=0;i<linesNb;i++) switch(lines[i].direct){ case 0: if(lines[i].x1 > lines[i].x2) {t = lines[i].x1; lines[i].x1 = lines[i].x2; lines[i].x2 = t;}; break; case 1: if(lines[i].y1 > lines[i].y2) {t = lines[i].y1; lines[i].y1 = lines[i].y2; lines[i].y2 = t;}; break;}}
Код:
public void Normalize2(){ int i,j,newLinesNb=linesNb; bool[] use = new bool [linesNb]; for(i=0;i<linesNb;i++) use[i]=true; for (i=0;i<linesNb;i++) for (j=0;j<linesNb;j++) if(i!=j && use[i] && use[j] && lines[i].direct==lines[j].direct) switch (lines[i].direct){ case 0: if(lines[i].y1 == lines[j].y1) if(lines[i].x2 == lines[j].x1) {lines[i].x2 = lines[j].x2; use[j] = false; newLinesNb--; i--; j = linesNb;} else if (lines[i].x1 == lines[j].x2) {lines[i].x1 = lines[j].x1; use[j] = false; newLinesNb--; i--; j = linesNb;} break; case 1: if(lines[i].x1 == lines[j].x1) if (lines[i].y2 == lines[j].y1) {lines[i].y2 = lines[j].y2; use[j] = false; newLinesNb--; i--; j = linesNb;} else if (lines[i].y1 == lines[j].y2) {lines[i].y1 = lines[j].y1; use[j] = false; newLinesNb--; i--; j = linesNb;} break;}
for(i=0;i<linesNb-1;i++) if(!use[i]) for (j = i + 1; j < linesNb; j++) if(use[j]){ lines[i] = lines[j]; use[j] = false;}
linesNb = newLinesNb; for (i = 0; i < linesNb; i++) lines[i].CalcLength();}
Сразу после нормализации можно проверить: если linesNb (количество отрезков, из которых состоит ломаная) 2-х ломаных неравны, то ломаные несовместимы (такой вывод можно делать только ПОСЛЕ нормализации). (3) Теперь посчитаем гориз. и верт. длины ломаной (эта функция добавляется в класс PolyLine):
Код:
public void CalcXYLength(){ for(int i=0;i<linesNb;i++) switch (lines[i].direct){ case 0: xLength += lines[i].length; break; case 1: yLength += lines[i].length; break;}}
(4) Зная эти длины в некоторых случаях можно либо сразу сказать, что ломаные несовместимы, либо ограничить варианты их поворота до 2-х. Т.е. если, например g1=2,v1=3 (gоризонтальная и vертикальная длины первой ломаной), а g2=2 и v2=4, то понятно, что ломаные несовместимы; если g1=g2, v1=v2, то поворачивать вторую ломаную будем только на 0 и 180 гр.; если g1=v2, v1=g2, то будем поворачивать только на 90 и 270 гр., а если g1=v1=g2=v2, то будем поворачивать на все углы. (5) Теперь в цикле пробуем поворачивать на нужные углы (доб. в класс Line функцию поворота). (5.1) После каждого поворота считаем сумму координат всех точек ломаной, отдельно по x и по y (для каждой ломаной). Эта функция доб. в класс PolyLine:
Код:
public void CalcSumXY(){ xSum = ySum = 0; for (int i = 0; i < linesNb; i++){ xSum += (lines[i].x1 + lines[i].x2); ySum += (lines[i].y1 + lines[i].y2);}}
Если xSum2-xSum1 (разность сумм по x второй и первой ломаной) и ySum2-ySum1 (аналогично) не делятся нацело на количество точек (т.е. на linesNb*2), то ломаные несовместимы. Если делятся (обе разности), то результат деления - это смещения по x и y соответственно для второй ломаной (смещения нужно отнимать от каждой соответствующей координаты). Небуду писать функцию - надеюсь понятно как это делается.
(5.2) Всё, после смещения можно покоординатно сравнивать ломаные. Т.е. берем каждый отрезок первой ломаной и ищем его с такими же координатами во второй ломаной (можно для удобства сначала сделать Normalize1). Если хоть один не найдем - ломаные НЕсовместимы. Если проверка прошла до конца, то всё - ответ: ломаные совместимы.
PS: Ничего проще придумать не смог. Работоспособность алгоритма тоже не проверял (т.к. нет функции поворота), но думаю что всё должно работать...
Member
Статус: Не в сети Регистрация: 05.08.2008 Откуда: Одесса мама
const
epsilon = 1E-6;//
var
A : array [1..n,1..n] of Real;
D : Real;
I : Integer;
J : Integer;
K : Integer;
Begin
Result := True;
for I:=1 to N do
for J:=1 to N do
begin
D := 0;
for K:=1 to N do
D := D + A[K,I]*A[K,J];
if (I=J) and (Abs(D)<epsilon) then
Result := False;
if (I<>J) and (Abs(D)>=epsilon) then
Result := False;
end;
Разбить экран главной диагональю. Окрасить верхнюю часть в красный, нижнюю - в синий. Изобразить желтую окружность диаметра D, перемещающуюся по вертикали через центр экрана.
Member
Статус: Не в сети Регистрация: 22.09.2007 Откуда: Отсюда
Люди, помагите, через пару дней экзамен по ООП.
Надо на делфи написать прогу: моделирование пружинного маятника. вводить массу груза, коэф. жесткости. визуально отображать движени пружины, и строить график зависимость скорости от времени.
Помагите плиз...
з.ы. если поможет, вот моя наработка - http://depositfiles.com/files/fjpqg8nn9
Нужно по информатике решить "задачку" на Паскале.Вот условие:В трёхмерном пространстве имеется кубик с единичной длиной ребра.Две противоположные вершины кубика имеют координаты(0,0,0)и(1,1,1).
Вводятся координаты двух произвольных вершин кубика(x,t,z) и (u,y,w)/
Требуется определить,лежат ли вершины с ведёнными координатами на одной ребре,на одной грани,совпадают одна с другой или являются противоположными.
Member
Статус: Не в сети Регистрация: 22.02.2008 Откуда: ниоткуда
dimon1993 писал(а):
Вводятся координаты двух произвольных вершин кубика(x,t,z) и (u,y,w)/ Требуется определить,лежат ли вершины с ведёнными координатами на одной ребре,на одной грани,совпадают одна с другой или являются противоположными.
Сравнивай попарно координаты. Если все разные, то вершины противоположны; пара одинаковых - лежат на одной грани; две пары одинаковых - лежат на одном ребре; три пары одинаковых - совпадают
Advanced member
Статус: Не в сети Регистрация: 23.10.2003 Откуда: Иркутск/Майкоп
Yubi писал(а):
Сравнивай попарно координаты. Если все разные, то вершины противоположны; пара одинаковых - лежат на одной грани; две пары одинаковых - лежат на одном ребре; три пары одинаковых - совпадают
Это сработает только при условии, что ребра параллельны осям координат. Если допускается поворот кубика вокруг оси, проходящей через вершины (0,0,0) и (1,1,1), тогда задача решается, например, через расчет расстояния между (x,t,z) и (u,y,v).
_________________ Края каждого совершенно нового крышка процессора не на 100% гладкая. Это связано с тем, что следов мастерства не избежать. (c) Али.
Member
Статус: Не в сети Регистрация: 19.08.2005 Откуда: Москва
помогите плиз , всех переспросил , никто не знает - база данных по access , работа готовая почти , только кое-что исправить
http://webfile.ru/2634057
1 Для записи в таблице Клиентов информации о второй и далее услугах необходимо вводить новый код и писать всю информацию о клиенте заново. В данной задаче это только телефон, но может быть: адрес, номер машины .... Надо сделать так, чтобы клиент был записан один раз с одним кодом, а в БД фиксировались все услуги полученные им от разных сотрудников.
2 Чтобы клиента можно было добавить без использования конструктора
3 Специализация сотрудника должна быть связана с услугой.
Member
Статус: Не в сети Регистрация: 23.12.2004 Откуда: Беларусь, Минск
Нечто вроде курсача-типового расчёта на C по теме "Именованые каналы" - под Windows, но без интерфейса - консольно.
Цитата:
Разработать программу-сервер и программу клиент для обмена сообщениями между двумя компьютерами при помощи именованных каналов. Клиент посылает серверу запрос на выполнение одной из команд: DIR, MKDIR, CD. Сервер принимает команду, выполняет ее, а результат отправляет клиенту.
Под винду... подскажите чтиво какое-нибудь... так-как в пояснении к задаче (5 строк) простенький пример работы каналов под WINNT
И ещё - для проганья на чистом C для консоли Windows (Vista) какой IDE лучше использовать? А то в универе и у меня под виндой - VS2008. а линухе у меня Анюта и Кдев, но уж больно хардкорные они - добавление простого
Код:
scanf("%d",i)
в "Hello world"-шаблон вызывает segmentation fault...
_________________ ASUS A4M88T-M, Athlon II X3 425, 2GB NCP, video - internal ATI 4250, 200GB Samsung HDD, Win7 x64
Advanced member
Статус: Не в сети Регистрация: 09.03.2004 Откуда: Кишинёв
AzaZeo писал(а):
И ещё - для проганья на чистом C для консоли Windows (Vista) какой IDE лучше использовать?
тот же VS2008 Express вполне подойдёт. Или что нибудь типа Code::Blocks с mingw (чтобы и под виндой было хардкорно ). По scanf уже подсказали. Если хотите чистого си, то в настройках лучше это явно указать.
AzaZeo писал(а):
Под винду... подскажите чтиво какое-нибудь...
Думаю MSDN содержит подробное описание, смотреть в сторону CreatePipe/CreateNamedPipe.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения