Wieża hanoi, drukowanie kolejnych tablic.

0

Witam,
zabrałem się za program z wieżą hanoi, użyłem poprawnego sposobu rekurencyjnego, który gdzieś widziałem, program powinien wyrzucać kolejne kroki przemieszczania się krążków, użyłem wskaźników, aby funkcja "zmiana mogła edytować naszą wieże, ale moje przeżycia ze wskaźnikami są na nikłym poziomie, zatem co robie źle ?

Dostaje z termianala następujący komunikat: warning: incompatible pointer types passing 'int [3][n]' to parameter of type 'int **' , kompiluje pod ubuntu -std=c99

 #include<stdio.h>

void zamiana(int **tab,int x1,int x2,int w)
	{
	int i=0;
	int k=w;
	while(tab[x1][i]==0)
		{
		i=i+1;
		}
	while(tab[x2][k]!=0)
		{
		k=k-1;
		}
		
	tab[x2][k]=tab[x1][i];
	tab[x1][i]=0;
	}
void drukowanie(int **tab,int w)
	{
	for(int k=0;k<w;k=k+1)
		{
		printf("%d    %d    %d\n",tab[0][k],tab[1][k],tab[2][k]);
		}
	printf("\n");
	}
void hanoi (int a0, int a1, int a2, int n, int **tablica,int wielkosc)
{
if(n>0)
{
    hanoi(a0, a2, a1, n-1,tablica,wielkosc);
    zamiana(tablica,a0,a1,n);// z a0 na a1
    drukowanie(tablica,wielkosc); // print tablicy
    hanoi(a2, a1, a0, n-1,tablica,wielkosc);
}
}
int main ()
{
    int n;
    printf ("Witam w programie przedstawiajacym rozwiazanie wiezy hanoi!\n");
    printf("Podaj liczbe krazkow:");
    scanf("%d", &n);
    int tab[3][n];
    for(int p=1; p<3;p=p+1)
    	{
    	for(int q;q<n;q=q+1)
    		{
    		tab[p][q]=0;
    		}
    	}
    for(int r=0;r<n;r=r+1)
    	{
    	tab[0][r]=r+1;
    	}
    drukowanie(tab,n);
    hanoi(0, 1, 2, n, tab,n);
    return 0;
}
0

Źle deklarujesz tablicę w main(). Jeżeli rozmiar tablicy nie jest znany podczas kompilacji, powinieneś deklarować tablicę dynamicznie:

int **tab = new int*[3];
for(int i = 0; i < 3; i++)
   tab[i] = new int [n];

Potem delete aby usunąć tablicę z pamięci.

0

Zmieniłem kod, teraz się niby kompiluje, wczytuje rozmiar tablicy, po czym wywala "Naruszanie ochrony pamięci:core dumped", ale przecież nigdzie nie wychodze za tablice z tego co widze...
Działa jedynie dla tablicy 2 no i dla 0, bo nic nie robi,
a dla 2 printuje następujące wyniki:
0 0 0
0 0 0

1 1 1
2 2 2

0 0 0
2 2 2

2 2 2
0 0 0

0 0 0
2 2 2

Za pierwszym razem printuje oczywiście wyzerowaną tablice, ale za drugim razem w pierwszej kolumnie powinny tylko być 1 2 a w reszcie kolumn same zera...

nowy kod:

#include<stdio.h>

void zamiana(int **tab,int x1,int x2,int w)
	{
	int i=0;
	int k=w;
	while(tab[x1][i]==0)
		{
		i=i+1;
		}
	while(tab[x2][k]!=0)
		{
		k=k-1;
		}
		
	tab[x2][k]=tab[x1][i];
	tab[x1][i]=0;
	}
void drukowanie(int **tab,int w)
	{
	for(int k=0;k<w;k=k+1)
		{
		printf("%d    %d    %d\n",tab[0][k],tab[1][k],tab[2][k]);
		}
	printf("\n");
	}
void hanoi (int a0, int a1, int a2, int n, int **tablica,int wielkosc)
{
if(n>0)
{
    hanoi(a0, a2, a1, n-1,tablica,wielkosc);
    zamiana(tablica,a0,a1,n);// z a0 na a1
    drukowanie(tablica,wielkosc); // print tablicy
    hanoi(a2, a1, a0, n-1,tablica,wielkosc);
}
}
int main ()
{
	int n;
	printf ("Witam w programie przedstawiajacym rozwiazanie wiezy hanoi!\n");
	printf("Podaj liczbe krazkow:");
	scanf("%d", &n);
	int *tab[3];
	for(int i = 0; i < 3; i=i+1)
		{tab[i] = tab[n];}
	for(int p=1; p<3;p=p+1)
		{
	    	for(int q=0;q<n;q=q+1)
	    		{
	    		tab[p][q]=0;
	    		}
	    	}
	drukowanie(tab,n);
	for(int r=0;r<n;r=r+1)
		{
		tab[0][r]=r+1;
		}
    drukowanie(tab,n);
    hanoi(0, 1, 2, n, tab,n);
    return 0;
}
} 
0

Jakieś pomysły co jest nie tak ?

1

Nadal źle deklarujesz tablicę.
Wcześniej zapomniałem, że chodzi Ci o C, podałem przykładowe rozwiązanie dla C++.
Spróbuj malloc() w takim razie.
Potem zwolnij pamięć z free().

#include <stdio.h>
#include <stdlib.h>
 int n = 0;
 int main(void) {
	int i = 0; int j = 0;
	printf("Hello World!\nPodaj ilosc elementow z tablicy:\n");
	scanf("%d", &n);
    int **tab;
    tab = malloc(3 * sizeof(int *));
    for(i = 0; i < 3; i++)
        tab[i] = malloc(n * sizeof(int));

     for(i = 0; i < 3; i++) //przypisujemy wartosc 0 kazdemu elementowi tablicy
        for(j = 0; j < n; j++)
            tab[i][j] = 0;
    for(i = 0; i < 3; i++) //wypisujemy
        for(j = 0; j < n; j++)
            printf("%d", tab[i][j]);
 
    //zwolnienie pamieci-------
    for (i = 0; i < 3; i++) {
    free(tab[i]);}             
    free(tab);  
    //-------------------------
 
	return 0;
}
 
0

Dzieki wielkie! Pojąłem już trochę lepiej (choć pewo nadal zbyt słabo) jak rezerwować miejsce.

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