Новый участник
Сообщения: 1
Благодарности: 0
|
Профиль
|
Отправить PM
| Цитировать
Пожалуйста проверти перевод и исправте мои ошибки, превожу программу с Паскаля на Си.
Код:
Program alg_greedy;
Uses Crt{*, Graph*};
Type Graph = Array[1..100,1..100] Of Integer;
List = Array[1..100] Of Integer;
Const Bukwy : Array[1..16] Of String = ('AA','AB','AC','AD','BB','BA','BC','BD','CC','CA','CB','CD','','','','');
Var g : Graph; {matriza Grapha}
newclr : List; {mnogestvo zakrashenyx vershin Grapha}
ver_g : List; {mnogestvo vershin Grapha}
n, temp: Integer; {kolichestvo vershin Grapha}
i, j, k: Integer;
otvet : Integer;
flag : Boolean;
{**********************************************}
Procedure greedy(Var ver_g:List; Var newclr:List);
Label 1;
Var found:Boolean;
v, w :Integer; {v - vershiny ver_g, w - versiny newclr}
ch_v, ch_w:Integer; {chetchik v, chetchik w}
begin
for i:=1 to n do
newclr[i]:=0;
ch_v:=1;
v:=ver_g[ch_v];
while (v<>0) do
begin
found:=false;
ch_w:=1;
w:=newclr[ch_w];
while(w<>0) do
begin
if (g[v,w] = 1) then
begin
found:=true;
ch_w := n;
end;
ch_w:=ch_w+1;
w:=newclr[ch_w];
end;
if (found = false) then
for ch_w:=1 to n do
if (newclr[ch_w]=0) then
begin
newclr[ch_w]:=v;
goto 1;
end;
1:ch_v:=ch_v+1;
v:=ver_g[ch_v];
end;
for i:=1 to n do
if (newclr[i]<>0) then
for j:=1 to n do
if (newclr[i] = ver_g[j]) then
for k:=j to n do
ver_g[k]:=ver_g[k+1];
End;
{**********************************************}
Begin
ClrScr;
Writeln('');
Writeln('');
Writeln('');
Writeln(' Osnovnaj programma');
Write(' Vvedite kolichestvo vershin Grapha -> ');
Read(n);
g[1,6] := 1;
g[1,10] := 1;
g[2,5] := 1;
g[2,7] := 1;
g[2,8] := 1;
g[2,10] := 1;
g[2,11] := 1;
g[2,12] := 1;
g[3,7] := 1;
g[3,8] := 1;
g[3,9] := 1;
g[3,12] := 1;
g[4,8] := 1;
g[4,12] := 1;
g[5,2] := 1;
g[5,11] := 1;
g[6,1] := 1;
g[6,10] := 1;
g[7,2] := 1;
g[7,3] := 1;
g[7,9] := 1;
g[7,10] := 1;
g[7,12] := 1;
g[8,2] := 1;
g[8,3] := 1;
g[8,4] := 1;
g[8,10] := 1;
g[8,12] := 1;
g[9,3] := 1;
g[9,7] := 1;
g[10,1] := 1;
g[10,2] := 1;
g[10,6] := 1;
g[10,7] := 1;
g[10,8] := 1;
g[11,2] := 1;
g[11,5] := 1;
g[12,2] := 1;
g[12,3] := 1;
g[12,4] := 1;
g[12,7] := 1;
g[12,8] := 1;
For i:=1 To n Do
For j:=1 To n Do
If (g[i,j] = 1) Then
g[j,i] := 1;
Write(' Ispolzuem greedy !!! 1 or 0 !!! -> ');
Read(otvet);
If (otvet = 1) Then
For i:=1 To n Do
ver_g[i] := i
Else
Begin
Writeln('');
Writeln(' No greedy !!!');
For i:=1 To n Do
Begin
g[i,n+2] := i;
For j:=1 To n Do
If (g[i,j] = 1) Then
g[i,n+1] := g[i,n+1] + 1;
End;
flag := true;
i := 1;
While (flag) Do
Begin
flag := false;
For j:=n Downto (i+1) Do
If (g[j-1,n+1] < g[j,n+1]) Then
Begin
temp := g[j-1,n+1];
g[j-1,n+1] := g[j,n+1];
g[j,n+1] := temp;
temp := g[j-1,n+2];
g[j-1,n+2] := g[j,n+2];
g[j,n+2] := temp;
flag := true;
End;
i := i + 1;
End;
For i:=1 To n Do
ver_g[i] := g[i,n+2];
End;
Writeln('');
While (ver_g[1] <> 0) Do
Begin
Write(' newclr = ');
greedy(ver_g,newclr);
For i:=1 To n Do
If (newclr[i] <> 0) Then
Write(' ',Bukwy[newclr[i]]:2);
Writeln('');
Write(' ver_g = ');
For i:=1 To n Do
If (ver_g[i] <> 0) Then
Write(' ',Bukwy[ver_g[i]]:2);
Writeln('');
Writeln('');
Readkey;
End;
Writeln(' ** Enter **');
Readkey;
End.
а вот мой код на си.
Код:
#include <conio.h>
#include <iostream.h>
#include <stdio.h>
int g[11][11]; // {matriza Grapha}
int newclr[100]; // {mnogestvo zakrashenyx vershin Grapha}
const char *Bukwy[]={"AA","AB","AC","AD","BB","BA","BC","BD","CC","CA","CB","CD"};
int ver_g[100]; // {mnogestvo vershin Grapha}
int n,temp; // {kolichestvo vershin Grapha}
int i,j,k;
int otvet;
bool flag;
void greedy(int ver_g[], int newclr[])
{
int i;
bool found;
int v, w; // {v - vershiny ver_g, w - versiny newclr}
int ch_v, ch_w;// {chetchik v, chetchik w}
for (i=0;i<n;i++)
newclr[i]=0;
ch_v=1;
v=ver_g[ch_v];
while (v!=0)
{
found=false;
ch_w=1;
w=newclr[ch_w];
while(w!=0)
{
if (g[v][w] == 1)
{
found=true;
ch_w = n;
}
ch_w=ch_w+1;
w=newclr[ch_w];
}
if (found == false)
for (ch_w=0; ch_w<n;ch_w++)
if (newclr[ch_w]==0)
{
newclr[ch_w]=v;
break;
//goto 1;
}
//1:
ch_v=ch_v+1;
v=ver_g[ch_v];
}
for (i=0;i<n;i++)
if (newclr[i]!=0)
for (j=0;j<n;j++)
if (newclr[i] == ver_g[j])
for (k=j;k<n;k++)
ver_g[k]=ver_g[k+1];
}
//{**********************************************}
void main()
{
cout<<" "<<endl;
cout<<" "<<endl;
cout<<" "<<endl;
cout<<(" Osnovnaj programma")<<endl;
cout<<(" Vvedite kolichestvo vershin Grapha -> ");
cin>>n;
g[0][5] = 1;
g[0][3] = 1;
g[1][4] = 1;
g[1][6] = 1;
g[1][7] = 1;
g[1][9] = 1;
g[1][10] = 1;
g[1][11] = 1;
g[2][6] = 1;
g[2][7] = 1;
g[2][8] = 1;
g[2][11] = 1;
g[3][7] = 1;
g[3][11] = 1;
g[4][1] = 1;
g[4][10] = 1;
g[5][0] = 1;
g[5][9] = 1;
g[6][1] = 1;
g[6][2] = 1;
g[6][8] = 1;
g[6][9] = 1;
g[6][11] = 1;
g[7][1] = 1;
g[7][2] = 1;
g[7][3] = 1;
g[7][9] = 1;
g[7][11] = 1;
g[8][2] = 1;
g[8][6] = 1;
g[9][0] = 1;
g[9][1] = 1;
g[9][5] = 1;
g[9][6] = 1;
g[9][7] = 1;
g[10][1] = 1;
g[10][4] = 1;
g[11][1] = 1;
g[11][2] = 1;
g[11][3] = 1;
g[11][6] = 1;
g[11][7] = 1;
for (i=0;i<n;i++)
for (j=0;j<n;j++)
if (g[i][j] == 1)
g[j][i] = 1;
cout<<(" Ispolzuem greedy !!! 1 or 0 !!! -> ");
cin>>(otvet);
if (otvet == 1)
for (i=0;i<n;i++)
ver_g[i] = i;
else
{
cout<<""<<endl;
cout<<(" No greedy !!!")<<endl;
for (i=0; i<n;i++)
{
g[i][n+2] = i;
for (j=0; j<n; j++)
if (g[i][j] == 1)
g[i][n+1] = g[i][n+1] + 1;
}
flag = true;
i = 1;
while (flag)
{
flag = false;
//for j:=n Downto (i+1) Do
for (j=n; j>(i+1); --j)
if (g[j-1][n+1] < g[j][n+1])
{
temp = g[j-1][n+1];
g[j-1][n+1] = g[j][n+1];
g[j][n+1] = temp;
temp = g[j-1][n+2];
g[j-1][n+2] = g[j][n+2];
g[j][n+2] = temp;
flag = true;
}
i = i + 1;
}
for (i=0; i<n; i++)
ver_g[i] = g[i][n+2];
}
cout<<" "<<endl;
while (ver_g[1] != 0)
{
cout<<" newclr = ";
greedy(ver_g,newclr);
for (i=0;i<n;i++)
if (newclr[i] != 0)
cout<<" "<<Bukwy[newclr[i]];
cout<<" "<<endl;
cout<<" ver_g = ";
for (i=0;i<n;i++)
if (ver_g[i] != 0)
cout<<" "<<Bukwy[ver_g[i]];
cout<<""<<endl;
cout<<""<<endl;
}
cout<<" ** Enter **";
getch();
}
|