0 / 0 / 0
Регистрация: 26.01.2015
Сообщений: 1
1

Перебор элементов с параметрами из массива

26.01.2015, 19:26. Показов 1583. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть файл с данными. 54 строки. В каждой строке 64 символа. (0..9,a..z,A..Z). Нужно прочитать файл в массив (в 1d или 2D, не знаю в какой лучше, думаю 2D). Собственно необходимо получить различные варианты 55 строки по 3 параметрам:
1.Каждый элемент по своему месту в строке не должен повторяться с этим же местом в предыдущий строках
Думаю сравнивать каждый Mi,j c Mi,j=0..54
2.Один и тот же элемент не может повторяться более двух раз подряд в строке (типа Mi,j=Mi-1,j)
3.Один и тот же элемент не может повторяться более 5 раз за всю строку.
Неужели нужно вводить счетчик на каждый тип символа и считать его для правильного конечно результата? И как собственно организовать перебор значений для получения строки в 64 символа?(множества строк)
Или вообще бросить эту задачу, поскольку считать он у меня будет годами?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.01.2015, 19:26
Ответы с готовыми решениями:

Перебор всех нечетных элементов массива х из 99 элементов
Чему будет равно значение переменной s после завершения фрагмента программы: s:=0; i:=1; while...

Перебор элементов массива
Добрый день. Есть точка в 3d-пространстве с определенными координатами - летящий самолет. А...

Перебор элементов массива
Господа,является ли метод do_something_with_value (*iter); в коде перебора , частью API ,или это...

Перебор элементов массива
Доброго времени! Я новичек в С++, поэтому прошу не ругать. Вопрос - как организовать перебор...

4
1 / 1 / 1
Регистрация: 07.10.2013
Сообщений: 13
27.01.2015, 09:31 2
Общая идея.
1) Читаем файл в массив.A(64,54). i - номер элемента в строке, j - номер строки.
2) В отдельной переменной создаем строку STR всех возможных элементов (0..9,a..z,A..Z).
3) В массив B(64,1) в каждую ячейку сохраняем STR, минус A(i,j), где i - номер текущй ячейки в B, а j - изменяется от 1 до 54.
4) В массиве B мы получили все возможные значения для каждого символо искомых строк. Используя рекурсивную функцию или цикл, мы можем получить все возможные строки, путем добавления к каждому символу ячейки B(X) все символы ячеек B(X+1) (не одновременно, естсественно), учитывая ограничения №2 и 3.
0
Эксперт Pascal/Delphi
2385 / 1297 / 1492
Регистрация: 29.08.2014
Сообщений: 4,661
27.01.2015, 10:51 3
как вариант, окончания дожидаться не стал...
Pascal
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
var
  v:array[1..64] of string[60];
  s,s1:string[64];
 
{procedure gen;//создаем файл
var
  f:text;
  c:char;
  i,j,k:integer;
begin
  randomize;
  assign(f,'e:\text.txt');
  rewrite(f);
  for i:=1 to 54 do begin
    for j:=1 to 64 do begin
      repeat c:=chr(random(254));until c in ['0'..'9','a'..'z','A'..'Z'];
      write(f,c);
    end;
    writeln(f);
  end;
  close(f);
end;
}
 
procedure rr(i:byte);
var
  j,k,l:byte;
  b:boolean;
begin
  if i=64 then for j:=1 to length(v[64]) do begin
   s[i]:=v[64][j];
   b:=true;
  for k:=1 to length(s)-2 do if (s[k]=s[k+1]) and (s[k]=s[k+2]) then begin b:=false;break;end;
    l:=0;
    for k:=i downto 1 do if s[i]=s[k] then l:=l+1;
  if (b) and (l<6) then writeln(s);
 end
  else for j:=1 to length(v[i]) do begin 
    s[i]:=v[i][j];
    b:=false;
    if (i<3) then b:=true else 
    if not ((s[i-2]=s[i]) and (s[i-1]=s[i]))then b:=true;
    l:=0;
    for k:=i downto 1 do if s[i]=s[k] then l:=l+1;
    if (b) and (l<6) then rr(i+1);
  end;
end;
 
procedure one;
var
  f:text;
  a:array[1..55,1..64] of char;
  c:char;
  i,j:integer;
begin
  assign(f,'e:\text.txt');
  reset(f);
  for i:=1 to 54 do begin
    for j:=1 to 64 do read(f,a[i,j]);
    readln(f);
  end;
  for j:=1 to 64 do begin
    s:='';
    for i:=1 to 54 do s:=s+a[i,j];
    for c:=#48 to #122 do
      if (c in ['0'..'9','a'..'z','A'..'Z']) and (pos(c,s)=0) then v[j]:=v[j]+c;
   end;
   s:='';   
   for i:=1 to 64 do s:=s+' ';
   rr(1);
   readln;
   close(f);
end;
 
begin
 
{gen;}
  one;
end.
1
1 / 1 / 1
Регистрация: 07.10.2013
Сообщений: 13
27.01.2015, 11:46 4
Таки написал код.
Текущая версия для семи строк и символов: '0'-'9'.
Константа lines - число строк в файле.
Константа chars - число возможных символов.
В процедуре GetAvailableSymbols можно изменять алфавит (возможные символы). Выделил красным.

Pascal
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
const lines = 7;
const chars = 10;
var 
A:array[1..lines] of string[chars];
B:array[1..chars] of string[chars];
Sizes:array[1..chars] of integer;
i:integer;
 
procedure Show(prefix:string; position:integer);
var i:integer;
begin
  for i:=1 to Sizes[position] do
    if (position = chars) then writeln( prefix + B[position][i])
    else Show(prefix + B[position][i], position+1);
end;
 
procedure ReadArray();
var F: text; i:integer;
begin
assign(F,'one.txt');
reset(F);
writeln('Читаем файл');
for i:= 1 to lines do begin
  read(F, A[i]);
  readln(F);
end;
close(F);
end;
 
procedure GetAvailableSymbols();
var check:boolean;
tmp_char:char;
i,j:integer;
begin
writeln('Считаем возможные символы');
for i:= 1 to chars do begin
  check := False;
  for tmp_char:= [COLOR="Red"]'0' to '9'[/COLOR] do begin
    for j:= 1 to lines do begin
      if (tmp_char = A[j][i]) then check := True;
    end;
    if (Not check) then B[i]:=B[i]+tmp_char;
    check := False;
  end;
  Sizes[i] := B[i].Length;
end;
end;
 
begin
ReadArray();
GetAvailableSymbols();
for i:=1 to Sizes[1] do
  Show(B[i], 2);
end.
0
Эксперт Pascal/Delphi
2385 / 1297 / 1492
Регистрация: 29.08.2014
Сообщений: 4,661
27.01.2015, 13:35 5
Lethal Ghost, а Вы, простите, на каком языке писали?

по Вашему примеру, получается строка результирующая - 14 символов, а входящая 10

Цитата Сообщение от Lethal Ghost Посмотреть сообщение
В процедуре GetAvailableSymbols можно изменять алфавит (возможные символы). Выделил красным.
- как задать алфавит в Вашей процедуре согласно условию (0..9,a..z,A..Z)?

Добавлено через 3 минуты
и нет проверки на условия 2 и 3
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.01.2015, 13:35
Помогаю со студенческими работами здесь

Перебор элементов массива
Добрый день. Помогите с циклом. есть массив: array(2) { =&gt; string(2) &quot;c1&quot; =&gt; string(97)...

Перебор элементов массива
Всем привет. Допустим есть двухмерный массив. В чем суть допустим 0 это пустота с ней ничего не...

Перебор элементов массива
Добрый день, ув. форумчане. В наличии следующий код: int i; WCHAR *slovo = {L&quot;слово1&quot;,...

Задача с параметрами и без параметров. Из массива удалить элементы, меньшие ср. арифметического четных элементов массива
Здравствуйте! Решите пожалуйста! Заранее спасибо! Нужно решить задачу с параметрами и без...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru