Program rozstawienie hetmanów

0

Witam!

Mam do poprawienia kod programu z rozstawiniem hetamnów, ale nie mam pojęcia jak to zrobić aby działało:

#include <stdio.h>
#include <stdlib.h>
#define n 8

int w[n], i;

int sprawdz(int x, int y){
	int i, OK;
	OK=1; i=0;
	while(i<x && OK){
	if ((w[i]-i==y-x)||(w[i]+i==y+x)||(w[i]==y)) OK=0;
	else i++;
	}
	return OK;
}

int ustaw (){
	int k;
	k=1;
	while(k<n && k>=0){
		do w[k]++;
		while(w[k]<n||sprawdz(k,w[k]));
		if(w[k]<n) k++;
		else{
			w[k]=0;
			k--;
		}
	}
	return k;
}

int main(){
	int i;
	w[0]=1;
	for(i=1;i<n;i++) w[i]=0;
		if(ustaw()=n){
		printf("\n");
		for(i=0;i<n;i++) printf("%d ",w[i]);
		}
	else printf("rozstawienie miemożliwe\n");
}

Oto błąd jaki wyskakuje przy próbie kompilacji i urichomienia programu. Wiem, że chodzi o coś z zapisem "if(ustaw()=n)", ale nie mam zielonego pojęcia jak to zapisać! Prosze o pomoc!

user image

0

Ale tam przecież żadnego błędu podczas kompilacji oraz uruchamiania nie ma - ba, nawet kończy się poprawnie (zerowy kod błędu), zgodnie z tym screenshotem.
Choć oczywiście sam kod jest błędny i nie mam pojęcia, co miałeś na myśli - if (ustaw() == n), a może int n = ustaw();?

Edit: co za szatan szepnął Ci, aby stałą nazwać n? :|
Zatem wychodzi na to, że miałeś na myśli if (ustaw() == n). Nazywaj zmienne i stałe sensowniej, bo połapać się w tym nie idzie.

0

Ale program się nie wyświetla po zdebugowaniu nie wiem dlaczego. I to ustaw w miejscu "if(ustaw()=n){" podkreśla na czrewono więc coś tam nie pasuje do końca...

Choć oczywiście sam kod jest błędny

No właśnie. W którym miejscu tkwi błąd jak go poprawić?

0

Zmieniłem na if (ustaw == n). Teraz już nie podkreśla na czerwono, a program uruchamia się. Ale nic w nim nie ma...

user image

0

Ależ w moim poście nigdzie nie ma if (ustaw == n), przeczytaj raz jeszcze.

0

No dokładnie jest "if (ustaw() == n)" i to właśnie wpisałem w kod. Tutaj w powyższym poście się pomyliłem. No tak czy siak praogram się kompiluje, ale w oknie nic nie ma.

0

Program jest banalny do napisania jak się wie jak działa wywołanie funkcji przez samą siebie - czyli ramka stosu,rekord aktywacji funkcji, zmienne lokalne na stosie wywołań, backtracing....

PS.
http://www.c4learn.com/c-programs/c-progran-to-implement-n-queens-problem.html

0

Jest za gorąco na mądre wywody, więc pokomentuje cały kod (bez analizowania co robi):

#include <stdio.h>
#include <stdlib.h>
#define n 8 // stałe polecam nazywać wielkimi literami - lepiej wtedy widać co to jest

int w[n], i; //zmienne globalne to zło, 'i' spokojnie można deklarować tam, gdzie jest to potrzebne, 'w' jestem w stanie darować (chociaż można to przekazywać jako parametr)

int sprawdz(int x, int y){
	int i, OK; // 'i' odrazu można przypisać wartość, 'OK' może przyjąć 2 wartości, więc spokojnie można zamienić na typ bool, a tak na prawdę nie jest to potrzebne bo...
	OK=1; i=0;
	while(i<x && OK){ // ... jeżeli zmienisz tego while na for (iterującego po i)...
	if ((w[i]-i==y-x)||(w[i]+i==y+x)||(w[i]==y))
		OK=0; // to tutaj spokojnie możesz dać return 0;...
	else i++; // ... to wyrzucić...
	}
	return OK; // ... a tu dać return 1;
}

int ustaw (){
	int k; // od razu przypisz wartość zmiennej
	k=1;
	while(k<n && k>=0){
		do w[k]++; // w pętli do while polecam stosowanie nawiasów, bo o wiele lepiej się to czyta
		while(w[k]<n||sprawdz(k,w[k])); // a tak w ogóle to program zapętla się w tym miejscu
		if(w[k]<n) k++; // jedna instrukcja == jedna linia kodu - lepiej się czyta (dotyczy całego programu, tutaj było miejesce żeby o tym wspomnieć)
		else{
			w[k]=0;
			k--;
		}
	}
	return k; // tak na pierwszy rzut oka funkcja może zwrócić '8' lub '-1' - wydaje mi się, że spokojnie wystarczyłoby zwrócenie bool i odpowiedni warunek w main
}

int main(){
	int i;
	w[0]=1;
	for(i=1;i<n;i++) w[i]=0; // jw. jedna instrukcja == jedna linia
		if(ustaw()=n){ // bardzo mylące wcięcie, if nie jest wewnątrz fora tylko pezpośrednio w main, więc powinno mieć takie samo wcięcie jak for; oczywiście warunek jest błędny, ale to już poprawiłeś
		printf("\n");
		for(i=0;i<n;i++) printf("%d ",w[i]); // jw. jedna instrukcja == jedna linia
		}
	else printf("rozstawienie miemożliwe\n");
}
0

Zmieniłem ten kod według twojego komentarza Kościej, ale ciągle w oknie programu nic nie ma...

#include <stdio.h>
#include <stdlib.h>
#define n 8 
 
int w[n], i; 
 
int sprawdz(int x, int y){
    int i, OK; 
    OK=1; i=0;
    for(i=1;i<x && OK;i++){ 
    if ((w[i]-i==y-x)||(w[i]+i==y+x)||(w[i]==y))
        return 0; 
    }
    return OK; 
}
 
int ustaw (){
    int k = 10;
    k=1;
    while(k<n && k>=0){
        do w[k]++; 
        while(w[k]<n||sprawdz(k,w[k])); 
        if(w[k]<n) k++; 
        else{
            w[k]=0;
            k--;
        }
    }
    return 1; 
}
 
int main(){
    int i;
    w[0]=1;
    for(i=1;i<n;i++) w[i]=0; 
        if(ustaw()==n){ 
        printf("\n");
        for(i=0;i<n;i++) 
			printf("%d ",w[i]); 
        }
    else printf("rozstawienie miemożliwe\n");
}

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