Zadatak 1.


#include <stdio.h>

int min(int a,int b)
{
   return (a<b)?a:b;
}

void main()
{
   int d[20],r[20],n,i,p,g,put = 0;

   printf("Unesite broj gradova : ");
   scanf("%d",&n);
   for(i=0;i<n;i++)
   {
      printf("Unesite rastojanje izmedju grada %d, i grada %d :",i,(i+1)%n);
      scanf("%d",d+i);
      put += d[i];
      r[i] = 0;
   }

   printf("Unesite redni broj grada za koji se traze minimalna rastojanja : ");
   scanf("%d",&g);

   p = 0;
   for(i=0;i<n;i++)
   {
      r[(g+i)%n] = min(p,put - p);
      p += d[(g+i)%n];
   }

   printf("Minimalna rastojanja :\n");
   for(i=0;i<n;i++)
      printf("Rastojanje od grada %d je %d\n",i,r[i]);
}


Zadatak 2.


#include <stdio.h>

typedef struct
{
   int i,j,visina;
} TVrh;

void razmeni(TVrh *v1,TVrh *v2)
{
   TVrh pom;
   pom = *v1;
   *v1 = *v2;
   *v2 = pom;
}

int specmin(int v,int u)
{
   if(v == -1) return u;
   else return (v<u)?v:u;
}

int vrh(int a[][5],int n,int m,int i,int j, int *vis)
{
   int p = 1,v = -1;
   if(i>0)
      if(a[i-1][j] >= a[i][j]) p = 0;
      else v = a[i][j] - a[i-1][j];
   if(i<n-1)
      if(a[i+1][j] >= a[i][j]) p = 0;
      else v = specmin(v,a[i][j] - a[i+1][j]);
   if(j>0)
      if(a[i][j-1] >= a[i][j]) p = 0;
      else v = specmin(v,a[i][j] - a[i][j-1]);
   if(j<m-1)
      if(a[i][j+1] >= a[i][j]) p = 0;
      else v = specmin(v,a[i][j] - a[i][j+1]);
   *vis = v;
   return p;
}

void main()
{
   int a[5][5],n,m,i,j,b = 0,vis;
   TVrh vrhovi[100];

   printf("Unesite dimenzije matrice : \n");
   scanf("%d%d",&n,&m);
   printf("Unesite elemente matrice : \n");
   for(i=0;i<n;i++)
      for(j=0;j<m;j++)
         scanf("%d",&a[i][j]);

   for(i=0;i<n;i++)
      for(j=0;j<m;j++)
         if(vrh(a,n,m,i,j,&vis))
         {
            vrhovi[b].i = i;
            vrhovi[b].j = j;
            vrhovi[b].visina = vis;
            b++;
         }
   for(i=0;i<b-1;i++)
      for(j=i+1;j<b;j++)
         if(vrhovi[i].visina < vrhovi[j].visina)
            razmeni(vrhovi+i,vrhovi+j);

   printf("Vrhovi sortirani po visini :\n");
   for(i=0;i<b;i++)
      printf("vrh (%d,%d), visina %d\n",vrhovi[i].i,vrhovi[i].j,vrhovi[i].visina);
}


Zadatak 3.


(define (s n)
  (if (= n 0) 0
      (+ (modulo n 10) (s (quotient n 10)))
  )
 )

(define (f n)
  (+ n (s n))
 )

(define (nadji n m)
  (nadipom (n m 0)
 )

(define (nadjipom n m i)
  (cond ((= n m) (list n i))
        ((> n m) (nadjipom n (f m) i))
        (t (nadjipom (f n) m (+ i 1)))
  )
 )

Zadatak 4.


resi([],[]).
resi([G|R],L) :- lista[G], resi(G,L1), resi(R,L2), spoji(L1,L2,L).
resi([G|R],[G|R1]) :- moze(G), resi(R,R1).
resi([G|R],L) :- resi(R,L).

lista([]).
lista([G|R]).

moze(X) :- s(X,S), obrni(X,0,Y), O1 is X mod S, O2 is Y mod S, O1 == O2.

obrni(0,X,X).
obrni(X,Yp,Y) :- X1 is X mod 10,X2 is X // 10, Yp1 is Yp*10+X1, obrni(X2,Yp1,Y).

spoji([],L,L).
spoji([G|R],L,[G|R1]) :- spoji(R,L,R1).