Advertisement
alvsjo

backtracking

Apr 3rd, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.21 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4.  
  5. int sumaNiza(int* a, int n)
  6. {
  7.     if (n==0)
  8.     {
  9.         return 0;
  10.     }
  11.     return a[n-1]+sumaNiza(a,n-1);
  12.  
  13. }
  14.  
  15. /*
  16. int sumaPodniza(int* a,int n, int s)
  17. {
  18.     if(n==-1)
  19.        return 0;
  20.     if(a[n-1]==s)
  21.         return 1;
  22.  
  23.     return sumaPodniza(a,n-1,s) || sumaPodniza(a,n-1,s-a[n-1]);
  24. }
  25.  */
  26.  
  27. int sumaPodniza(int* a,int n, int s)
  28. {
  29.     if(n==-1)
  30.        return 0;
  31.     if(a[n-1]==s)
  32.         {
  33.             printf("%4d",a[n-1]);
  34.             return 1;
  35.         }
  36.    else
  37.    {
  38.     int with=sumaPodniza(a,n-1,s-a[n-1]);
  39.     if(with)
  40.     {
  41.         printf("%4d",a[n-1]);
  42.         return 1;
  43.     }
  44.     int without=sumaPodniza(a,n-1,s);
  45.     if(without)
  46.     {
  47.         return 1;
  48.     }
  49.    }
  50.     return 0;
  51. }
  52.  
  53.  
  54. int sol[100];
  55. int cnt=0;
  56. void sumaPodskupa(int* a,int n, int s)
  57. {
  58.     if(n==-1)
  59.        return;
  60.     if(0==s)
  61.         {
  62.             int i;
  63.             for(i=0;i<cnt;i++)
  64.             {
  65.                 printf("%4d",sol[i]);
  66.             }
  67.             printf("\n");
  68.         }
  69.    else
  70.    {
  71.        sol[cnt++]=a[n-1];
  72.        //sol[cnt]=a[n-1]; cnt++;
  73.         sumaPodskupa(a,n-1,s-a[n-1]);
  74.         cnt--;
  75.  
  76.         sumaPodskupa(a,n-1,s);
  77.    }
  78.  
  79. }
  80. //data binarna matrica m x n
  81. //napisati funkciju koja provjerava da li robot moze sa pozicije 0,0 do m-1,n-1
  82. //kretajuci se dolje ili desno po nulama
  83.  
  84. int postojiPut(int **mat, int m, int n,int i, int j)
  85. {
  86.     if(i==m-1&&j==n-1)
  87.         return 1;
  88.  
  89.     int desno=0;
  90.     if(j<n-1 && mat[i][j+1]==0)
  91.     {
  92.         desno=postojiPut(mat,m,n,i,j+1);
  93.     }
  94.     if(desno)
  95.         return 1;
  96.     int dolje=0;
  97.     if(i<m-1 && mat[i+1][j]==0)
  98.     {
  99.         dolje=postojiPut(mat,m,n,i+1,j);
  100.     }
  101.     if (dolje)
  102.         return 1;
  103.  
  104.  
  105.     return 0;
  106.  
  107. }
  108.  
  109.  
  110. int put[100];
  111. int br;
  112. void postojiPutSve(int **mat, int m, int n,int i, int j)
  113. {
  114.     if(i==m-1 && j==n-1)
  115.        {
  116.           int k;
  117.           for(k=0;k<br;k++)
  118.           {
  119.               if(put[k]==6)
  120.                 printf("desno ");
  121.               else
  122.                 printf("dolje ");
  123.           }
  124.           printf("\n");
  125.        }
  126.   else
  127.   {
  128.     put[br]=6;
  129.     br++;
  130.     if(j<n-1 && mat[i][j+1]==0)
  131.     {
  132.        postojiPutSve(mat,m,n,i,j+1);
  133.     }
  134.     br--;
  135.  
  136.     put[br++]=2;
  137.  
  138.     if(i<m-1 && mat[i+1][j]==0)
  139.     {
  140.         postojiPutSve(mat,m,n,i+1,j);
  141.     }
  142.    br--;
  143.  
  144.   }
  145.  
  146.  
  147. }
  148.  
  149. int posjecen[100][100];
  150. void postojiPut22(int **mat, int m, int n,int i, int j)
  151. {
  152.     if(i==m-1 && j==n-1)
  153.        {
  154.           int k;
  155.           for(k=0;k<br;k++)
  156.           {
  157.               if(put[k]==6)
  158.                 printf("desno ");
  159.               else if(put[k]==2)
  160.                 printf("dolje ");
  161.               else if(put[k]==4)
  162.                 printf("lijevo ");
  163.               else if(put[k]==8)
  164.                 printf("gore ");
  165.           }
  166.           printf("\n");
  167.        }
  168.   else
  169.   {
  170.  
  171.     put[br]=6;
  172.     br++;
  173.     if(j<n-1 && mat[i][j+1]==0 && posjecen[i][j+1]==0)
  174.     {
  175.         posjecen [i][j+1]=1;
  176.        postojiPut22(mat,m,n,i,j+1);
  177.           posjecen[i][j+1]=0;
  178.     }
  179.     br--;
  180.  
  181.  
  182.     put[br++]=2;
  183.  
  184.     if(i<m-1 && mat[i+1][j]==0 && posjecen[i+1][j]==0)
  185.     {
  186.         posjecen[i+1][j]=1;
  187.         postojiPut22(mat,m,n,i+1,j);
  188.         posjecen[i+1][j]=0;
  189.     }
  190.    br--;
  191.  
  192.    put[br]=4;
  193.     br++;
  194.     if(j>0 && mat[i][j-1]==0 && posjecen[i][j-1]==0)
  195.     {
  196.         posjecen [i][j-1]=1;
  197.        postojiPut22(mat,m,n,i,j-1);
  198.        posjecen[i][j-1]=0;
  199.     }
  200.  
  201.     br--;
  202.  
  203.  
  204.     put[br++]=8;
  205.  
  206.     if(i>0 && mat[i-1][j]==0 && posjecen[i-1][j]==0)
  207.     {
  208.         posjecen[i-1][j]=1;
  209.         postojiPut22(mat,m,n,i-1,j);
  210.         posjecen[i-1][j]=0;
  211.     }
  212.    br--;
  213.   }
  214.  
  215.  
  216. }
  217.  
  218.  
  219. int main()
  220. {
  221.    // int a[6]={10,7,16,25,13,19};
  222.     //printf("\n%d\n",sumaPodniza(a,6,30));
  223.     //sumaPodskupa(a,6,26);
  224.  
  225.     FILE* f= fopen("a_file.txt","r");
  226.  
  227.     int m,n;
  228.     fscanf(f,"%d %d",&m,&n);
  229.  
  230.     int **mat;
  231.     mat=malloc(m*sizeof(int*));
  232.     int i;
  233.  
  234.     for(i=0;i<m;i++)
  235.         mat[i]=malloc((n*sizeof(int)));
  236.  
  237.     int j;
  238.     for(i=0;i<m;i++)
  239.     {
  240.         for(j=0;j<n;j++)
  241.             fscanf(f,"%d",&mat[i][j]);
  242.             posjecen[i][j]=0;
  243.     }
  244.  
  245.     postojiPut22(mat,m,n,0,0);
  246.  
  247.     return 0;
  248. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement