Задача: Прямоугольный садовый участок шириной N и длиной M метров разбит на квадраты со стороной 1 метр. На этом участке вскопаны грядки. Грядкой называется совокупность квадратов, удовлетворяющая таким условиям: • из любого квадрата этой грядки можно попасть в любой другой квадрат этой же грядки, последовательно переходя по грядке из квадрата в квадрат через их общую сторону; • никакие две грядки не пересекаются и не касаются друг друга ни по вертикальной, ни по горизонтальной сторонам квадратов (касание грядок углами квадратов допускается). Подсчитайте количество грядок на садовом участке. Ограничения: 1 <= N, M <= 200, время 1 с. Ввод из файла beds.in. В первой строке находятся числа N и M через пробел, далее идут N строк по M символов. Символ # обозначает территорию грядки, точка соответствует незанятой территории. Других символов в исходном файле нет. Вывод в файл beds.out. Вывести одно число - количество грядок на садовом участке. Примеры Ввод 1 5 10 ##......#. .#..#...#. .###....#. ..##....#. ........#. Вывод 1 3 Код проги на Pascal: Code: { Written by Fyodor Menshikov 26.01.2004 14:46-14:55 } {$R+,Q+} var c:array[0..201,0..201]of char; type arr=array[1..40000]of byte; var first,last:word; ii,jj:^arr; procedure put(i,j:integer); begin if c[i,j]='#' then begin inc(last); ii^[last]:=i; jj^[last]:=j; c[i,j]:='.'; end; end; procedure get(var i,j:integer); begin i:=ii^[first]; j:=jj^[first]; inc(first); end; procedure paint(i,j:integer); begin first:=1; last:=0; put(i,j); while first<=last do begin get(i,j); put(i+1,j); put(i-1,j); put(i,j+1); put(i,j-1); end; end; var n,m,i,j,count:integer; begin new(ii); new(jj); assign(input,'beds.in'); reset(input); assign(output,'beds.out'); rewrite(output); readln(n,m); for i:=0 to n+1 do for j:=0 to m+1 do c[i,j]:='.'; for i:=1 to n do begin for j:=1 to m do read(c[i,j]); readln; end; count:=0; for i:=1 to n do for j:=1 to m do if c[i,j]='#' then begin paint(i,j); inc(count); end; writeln(count); end. Нужно просто перевести этот код в C++ (плачу 100 рублей), а если переведёте и объясните что зачем, коментами, то 200 рублей. Деньги буду через терминал кидать, так что либо на мобилу, либо на WebMoney.
Я знаю, даже знаю эту прогу P2c называеться, но она настолько криво переводит, что я не могу разобраться, а как известно ошибки всегда труднее исправлять чем писать с нуля. А вообще это задание по курсовому, и времени особо нет!! Ну помогите!
Вообще то, что ты дал не работает. Если только так: Code: program p1; type arr=array[1..40000] of byte; var n,m,i,j,count:integer; c:array[0..201,0..201] of char; first,last:word; ii,jj:^arr; input,output: text; procedure put(i,j:integer); begin if c[i,j]='#' then begin inc(last); ii^[last]:=i; jj^[last]:=j; c[i,j]:='.'; end; end; procedure get(var i,j:integer); begin i:=ii^[first]; j:=jj^[first]; inc(first); end; procedure paint(i,j:integer); begin first:=1; last:=0; put(i,j); while first<=last do begin get(i,j); put(i+1,j); put(i-1,j); put(i,j+1); put(i,j-1); end; end; begin new(ii); new(jj); assign(input,'c:\beds.in'); assign(output,'c:\beds.out'); reset(input); rewrite(output); readln(input,n,m); for i:=0 to n+1 do for j:=0 to m+1 do c[i,j]:='.'; for i:=1 to n do begin for j:=1 to m do read(input,c[i,j]); readln(input); end; count:=0; for i:=1 to n do for j:=1 to m do if c[i,j]='#' then begin paint(i,j); inc(count); end; write(output,count); close(input); close(output); end.
Вот практически рабочий вариант: Code: #include <fstream.h> char c[202][202]; typedef arr, byte[40000]; unsigned short first,last; int n,m,i,j,coun; arr *ii, *jj; void put(int i, int j) { if (c[i][j] == '#') { last++; ii[last] = i; jj[last] = j; c[i][j] = '.'; } } void get(int *i, int *j) { *i = ii[first]; *j = jj[first]; first++; } void paint(int i, int j) { first = 1; last = 0; put(i,j); while (first<=last) { get(&i,&j); put(i+1,j); put(i-1,j); put(i,j+1); put(i,j-1); } } void main() { ii = new arr; jj = new arr; ifstream input("beds.in"); ofstream output("beds.out"); input >> n; input >> m; for (i = 0; i <= n+1; i++) for (j = 0; j <= m+1; j++) c[i][j] = '.'; for (i = 1; i <= n; i++) { for (j = 1; j <= m; j++) input >> c[i][j]; } coun = 0; for (i = 1; i <= n; i++) for (j = 1; j <= m; j++) if (c[i][j] == '#') { paint(i,j); coun++; } /* delete[] ii; delete[] jj; */ output << coun; } Где-то с указателями бага (ошибка при освобождении), но ответ вроде правильный...
Code: # -*- coding: cp1251 -*- from UserString import MutableString lines = [ "1100111110", "0011100010", "0010000111", "0010110010", "0010000010", "0011111110" ] lines.insert(0, MutableString("0"*len(lines[0]))) lines.append(MutableString("0"*len(lines[0]))) for i in range(len(lines)): lines[i] = MutableString("0" + lines[i] + "0") def convert1To2(): done = False while not done: done = True for i in range(len(lines)): for j in range(len(lines[i])): if lines[i][j] == '1' and \ (lines[i+1][j] == '2' or \ lines[i-1][j] == '2' or \ lines[i][j+1] == '2' or \ lines[i][j-1] == '2'): lines[i][j] = '2' done = False amount = 0 for i in range(len(lines)): for j in range(len(lines[i])): if lines[i][j] == '1': lines[i][j] = '2' amount += 1 convert1To2() print "Итого: ", amount На питоне
НА С++: Code: #include <Python.h> int main(int argc, char *argv[]) { Py_Initialize(); PyRun_SimpleString(тут строка с кодом нап питоне); Py_Finalize(); return 0; }
Код питона в стоку на C++ генерировать так: Code: s = '' for i in open('code.py').readlines(): l = repr(i)[1:-1] l = l.replace('"', '\\"') s += ('"' + l + '"\n ') code = 'char code[] = %s;\n' % s fh = open('code.c', 'w') fh.write(code) fh.close()
Joker-jar Чувак, ты меня просто спас. 427-164-887 ICQ давай мобилу или WebMoney как договаривались +).