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");
}