KWARDAT MAGICZNY

0

Witam no więc chciałem stworzyć program który odpowiada na pytanie czy idze stworzyć kwadrat magiczny o wymairach n x n , o sumie każdego rzedu i kolumny równej s dla liczb o 1 do m. Stworzyłem taki oto program. Alokuje on dynamicznie tablice o wyamirach n x n , potem rekurencjyjnie sprawdza kazda mozlwiosc tzn losuje na kazde pole liczbe od 1 do m uzywajac funkcjii uzyte zeby ominac wykorzystane wartosci, co 1 rzad spaprawdza sume jesli dobra tworzy nastepny rzad az dojdzie do ostatniego pola(zminna ilezuzyte) wtedy iteracyjnei sprawdza czy kolumny sie zgadzaja jak tak zwraca true. Program prosty ale wariuje nie wiem czemu chociaż przśledziłem jego kod dziesiątki razy i nie widze błędów. Byłbym bardzo wdzięczny za pomoc gdyż ten probem nie daj mi żyć. Pozdrawiam Kod:

#include <stdio.h>
#include <stdlib.h>

void wypisz(int** tab, int n);
int czy(int **tab,int *uzyte, int j, int i, int s,int n,int m,int ileuzyte, int val, int aktualnasuma);
int uzyta(int *uzyte, int val, int ileuzyte);

int main()
{
  int n,m,s;
  printf("Podaj n: ");
  scanf("%d",&n);
  printf("Podaj m: ");
  scanf("%d",&m);
  printf("Podaj s: ");
  scanf("%d",&s);
  if(n<=0 || m <=0 || s<=0)
  {
    fprintf(stderr,"n,m,s musza byc dodatnie!\n");
    return 1;
  }
  
  if(m <n*n)
  {
    printf("NIE\n");
    return 0;
  }
  
  int **tab = (int**) malloc(n*sizeof(int*)); //ALOKACJA TABLICY
  if(tab==NULL)
  {
    fprintf(stderr,"Nie udalo sie zaalokowac pamieci!\n");
    return 2;
  }
  for(int i=0;i<n;i++)
  {
    tab[i] = (int*) malloc(n*sizeof(int));
    if(tab[i]==NULL)
    {
      for(int j=0; j<i; j++) free(tab[j]);
      free(tab);
      fprintf(stderr,"Nie udalo sie zaalokowac pamieci!\n");
      return 3;
    }
  }
  
  int *uzyte = (int*) malloc(m*sizeof(int)); //ALOKACJI TABLICJI ZUZYTE
  if(uzyte==NULL)
  {
    fprintf(stderr,"Nie udalo sie zaalokowac pamieci!\n");
    for(int i=0;i<n;i++) free(tab[i]);
    free(tab);
    return 4;
  }
  
//printf("%d\t",czy(tab, uzyte,0,0,s,n,m,0,1,0));


 if (czy(tab, uzyte,0,0,s,n,m,0,1,0)) 
 {
 printf("Tak\n");
 wypisz(tab,n);
 }
 else 
 printf("NIE\n");
 
 }

int uzyta(int *uzyte, int val, int ileuzyte)
{   
    for (int k=0; k<ileuzyte;k++)    //SPRAWDZANIE AKTUALNEGO ELEMENTU Z KOLEJNYMI WYRAZAMI TABLICY UZYTE
	if (val==uzyte[k]) return 1;
	
return 0;
         
}

int czy(int **tab,int *uzyte, int j, int i, int s,int n,int m,int ileuzyte,int val, int aktualnasuma)
{ 
  if (ileuzyte!=n*n) 
  {
  printf("NIE\n");
  if (j!=n) 	
  {
     for (int val=1; val<=m ;val++) 
     {
	     if (!uzyta(uzyte, val, ileuzyte))            
	     {
			//	printf("nie\n");
		  uzyte[ileuzyte]=val;                                     //DODANIE ZUZYTEJ WARTOSCI DO UZYTE
		  tab [i][j]=val;     
		   j++;
		   ileuzyte++;                                   //DODAJE ELEMENT
          czy(tab, uzyte,j,i,s,n,m,ileuzyte,1,aktualnasuma+val ); //zwieksza ilos wyznaczonych pul przesuwa sie o 1 w dul i przechodzi do nastepnego pola
		 }
        
     }
   }
   else if (aktualnasuma==s) //JEZELI SUMA W KOLUMNIE SIE ZGADZA PRZEJDZ NOWA KOLUMNE I DO PIERWSZEGO WIERSZA
        { 	
        i++;
	     czy(tab, uzyte,0,i,s,n,m,ileuzyte,1,0);	
        }
        else return 0;  
    }
    else //JEZELI PRZESZLO WSZSYTKIE KOLUMNY NIECH ZACZNIE SPRAWDZAC WIERSZE
    {
		aktualnasuma=0;
	    for(int j=0;j<n;j++)
	    {
	       for(int i=0;i<n;i++) aktualnasuma=tab[i][j]+aktualnasuma;
	    
		if (aktualnasuma==s) //JEZELI SUMMA W WIERSZU SIE ZGADZA SPRAWDZAJ ANSTEPNY WIERSZ
	       aktualnasuma=0;
		else return 0;
        
		}
    
    return 1;  //PRAWDA
    }
  
    
	
}

void wypisz(int **tab, int n)
{
  for(int i = 0; i < n; i++) {
		for(int j = 0; j < n; j++) {
			printf("%d\t",tab[i][j]);
		}
		printf("\n");
	}
} 
0

Aha sorry za tego printf w tym miejscu zapomanilem go skasowac, bo uzywalem wczesniej przy debugowaniu.

   if (ileuzyte!=n*n) 
  {
  <del>printf("NIE\n");</del>
  if (j!=n)     

Dzięki za pomoc Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1