Здравствуйте! Ребят, помогите найти и исправить ошибку.
Есть код на с, одну задачу он решает правильно, а другую нет...
45 15 22 20
25 9 5 3 10
55 6 3 8 2
22 3 8 4 7
PHP код:
//====================================================================
void pereraspred(int *proc,int *pd,int *ka,int *kb,int *pz,int *pl)
{int ini=6,inj=6;
hu:
int *z,*l,max,min,kold;
int x=6,y=6,fun1=0,ax=6,bx=6;
int i,j,t,k,f,q,w; //--Динамическое распределение памяти
ka=(int*)malloc(3*sizeof(int));
kb=(int*)malloc(4*sizeof(int));
z=(int*)malloc(6*sizeof(int));
l=(int*)malloc(12*sizeof(int));
for(i=0;i<3;i++)
for(j=0;j<4;j++)
*(pl+j+4*i)=0;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
if(*(pd+j+4*i)!=0)*(pl+j+4*i)=1;
for(i=0;i<3;i++)
*(ka+i)=99;
for(j=0;j<4;j++)
*(kb+j)=99;
*(kb+0)=0;
kold=0;
max=*(proc+0+4*0);
//--Проверка на вырожденность
for(i=0;i<3;i++) //Кол.строк + кол.столбцов-1=кол.заполн.клеток
for(j=0;j<4;j++)
if(max<*(proc+j+4*i)) max=*(proc+j+4*i);
min=max;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
if(*(pd+j+4*i)!=0)kold++;
if(kold<6){ for(i=0;i<3;i++)
for(j=0;j<4;j++)
{if((i==ini) && (j==inj))continue;
else if((min>*(proc+j+4*i)) && *(pd+j+4*i)==0){min=*(proc+j+4*i);
x=i;
y=j;}}
*(pl+y+4*x)=3;
ini=6;
inj=6;
}
//--Нахождение потенциалов
while(1)
{t=0;
for(j=0;j<4;j++)
{for(i=0;i<3;i++)
if(*(pd+j+4*i)!=0||*(pl+j+4*i)==3)
if(*(kb+j)!=99)*(ka+i)=*(proc+j+4*i)-*(kb+j);
else if(*(ka+i)!=99)*(kb+j)=*(proc+j+4*i)-*(ka+i);
else t++;
else continue;
}
if(t==0) break;
}
//--Вывод матрицы Сij с потенциалами
printf("\nМатрица времени работ(C)");
printf("\n");
for(i=0;i<4;i++)
if(i!=3){for(j=0;j<5;j++)
if(j!=4)printf(" %d ",*(proc+j+4*i));
else printf("│ %d",*(ka+i));
printf("\n");
}
else {printf("────────────┘");
printf("\n");
for(j=0;j<4;j++)
printf(" %d ",*(kb+j));
}
printf("\n");
//--Нахождение дельт
max=0;
q=0;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
{if(*(pd+j+4*i)!=0||*(pl+j+4*i)==3)continue;
else {*(pz+q)=*(ka+i)+*(kb+j)-*(proc+j+4*i);
if(max<*(pz+q)){max=*(pz+q);
k=i; //Дельта=Сумма потенциалов-Cij
f=j;}
q++;}
}
*(pl+f+4*k)=5;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
fun1+=*(proc+j+4*i)**(pd+j+4*i);
printf("\nМатрица распределения времени(D)\n");
for(i=0;i<3;i++)
{for(j=0;j<4;j++)
printf(" %d ",*(pd+j+4*i));
printf("\n");
}
getch();
//--Ответ на печать
if(max<=0){printf("\t\t\tМинимальная сумма затрат времени на \n\t\t\tобслуживание участков работ равна %d",fun1);
return;}
else
{ w=k;
while(1)
{
met:i=w;
for(j=0;j<4;j++)
if(*(pl+j+4*i)==0 || *(pl+j+4*i)==5 || *(pl+j+4*i)==7)continue;
else
{
*(pl+j+4*i)=2;
ax=i;bx=j;
for(i=0;i<3;i++)
if(i==ax)continue;
else{ if(*(pl+j+4*i)==5){t=0;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
{if(*(pl+j+4*i)==2)
if(t==0){min=*(pd+j+4*i);
t++;
if(min==0)
{ini=i;
inj=j;
goto hu;}
}
else if(min>=*(pd+j+4*i))
{ min=*(pd+j+4*i);
if(min==0)
{ini=i;
inj=j;
goto hu;}
}
}
for(i=0;i<3;i++)
for(j=0;j<4;j++)
if((*(pl+j+4*i)==5) || (*(pl+j+4*i)==7))
*(pd+j+4*i)+=min;
else if(*(pl+j+4*i)==2)
*(pd+j+4*i)-=min;
free(l); //--Освобождение памяти
free(z);
free(ka);
free(kb);
goto hu;
}
else if((*(pd+j+4*i)!=0 || *(pl+j+4*i)==3))
{
*(pl+j+4*i)=7;
w=i;
goto met;}
else *(pl+j+4*i)=0;}
*(pl+bx+4*ax)=0;
i=w;
}
}
}