sudoku c++

0

Napisałem program , który miał rozwiązywać sudoku, ale coś nie działa.
Program zatrzymuj się po wyświetleniu: zaczynamy rozwiązywanie, i nic nie robi

 #include <iostream>
#include<conio.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

using namespace std;
int w[81];
int s[81]={0};
int a,b,c,d ;
int i=0;
int roz(int i)
{
	for(a=0,b=0,c=0, s[i]=1; a==0||b==0||c==0;a=1,b=1,c=1);
	{
	
	/***********sprawdza w poziomie***********/
		if(i==(0||9||18||27||36||45||54||63||72)); //jesli jest w pierwszej kolumnie
		{
			while(s[i]==(s[i+1]||s[i+2]||s[i+3]||s[i+4]||s[i+5]||s[i+6]||s[i+7]||s[i+8]));
			{
				s[i]+=1;
				b=0;
				c=0;
			}
		}
		if (i==(1||10||19||28||37||46||55||64||73)); //jesli jest w 2. kolumnie
		{
			while(s[i]==(s[i+1]||s[i+2]||s[i+3]||s[i+4]||s[i+5]||s[i+6]||s[i+7]||s[i-1]));
			{
				s[i]+=1;
				b=0;
				c=0;
			}
		}
		if(i==(2||11||20||29||38||47||56||65||74)) //jesli jest w 3. kolumnie
		{
			while(s[i]==(s[i+1]||s[i+2]||s[i+3]||s[i+4]||s[i+5]||s[i+6]||s[i-1]||s[i-2]));
			{
				s[i]+=1;
				b=0;
				c=0;
			}
		}
		if(i==(3||12||21||30||39||48||57||66||75)) //jesli jest w  4.kolumnie
		{
		  	while(s[i]==(s[i+1]||s[i+2]||s[i+3]||s[i+4]||s[i+5]||s[i-3]||s[i-1]||s[i-2]));
		  	{
		  		s[i]+=1;
		  		b=0;
				c=0;
			}
		}
		if(i==(4||13||22||31||40||49||58||67||76)) //jesli jest w  5. kolumnie
		{
			while(s[i]==(s[i+1]||s[i+2]||s[i+3]||s[i+4]||s[i-4]||s[i-3]||s[i-1]||s[i-2]));
			{
		  		s[i]+=1;
		  		b=0;
				c=0;
			}
		}
		if(i==(5||14||23||32||41||50||59||68||77)) //jesli jest w 6. kolumnie
		{
			while(s[i]==(s[i+1]||s[i+2]||s[i+3]||s[i-5]||s[i-4]||s[i-3]||s[i-1]||s[i-2]));
			{
		  		s[i]+=1;
		  		b=0;
				c=0;
			}
		}
		if(i==(6||15||24||33||42||51||60||69||78)) //jesli jest w  7. kolumnie
		{
			while(s[i]==(s[i+1]||s[i+2]||s[i-6]||s[i-5]||s[i-4]||s[i-3]||s[i-1]||s[i-2]));
			{
		  		s[i]+=1;
		  		b=0;
				c=0;
			}
		}
		if(i==(7||16||25||34||43||52||61||70||79)) //jesli jest ww 8.kolumnie
		{
			while(s[i]==(s[i+1]||s[i-7]||s[i-6]||s[i-5]||s[i-4]||s[i-3]||s[i-1]||s[i-2]));
			{
		  		s[i]+=1;
		  		b=0;
				c=0;
			}
		}
		if(i==(8||17||26||35||44||53||62||71||80)) //jesli jest w 9. kolumnie
		{
			while(s[i]==(s[i+1]||s[i-7]||s[i-6]||s[i-5]||s[i-4]||s[i-3]||s[i-1]||s[i-2]));
			{
		  		s[i]+=1;
		  		b=0;
				c=0;
			}
		}
		/**************sprawdza w  pionie************/
		if(i==(0||1||2||3||4||5||6||7||8)) //jesli jest w 1. wierszu
		{
			while(s[i]==(s[i+9]||s[i+18]||s[i+27]||s[i+36]||s[i+45]||s[i+54]||s[i+63]||s[i+72]))
			{
				s[i]+=1;
				a=0;
				c=0;
			}
		}
		if(i==(9||10||11||12||13||14||15||16||17)) //jesli jest w  2 .wierszu
		{
			while(s[i]==(s[i+9]||s[i+18]||s[i+27]||s[i+36]||s[i+45]||s[i+54]||s[i+63]||s[i-9]))
			{
				s[i]+=1;
				a=0;
				c=0;
			}
		}
		if(i==(18||19||20||21||22||23||24||25||26)) //jesli jest w 3. wieszu
		{
			while(s[i]==(s[i+9]||s[i+18]||s[i+27]||s[i+36]||s[i+45]||s[i+54]||s[i-18]||s[i-9]))
			{
				s[i]+=1;
				a=0;
				c=0;
			}
		}
		if(i==(27||28||29||30||31||32||33||34||35)) //jesli jest w 4. wierszu
		{
			while(s[i]==(s[i+9]||s[i+18]||s[i+27]||s[i+36]||s[i+45]||s[i-27]||s[i-18]||s[i-9]))
			{
				s[i]+=1;
				a=0;
				c=0;
			}
		}
		if(i==(36||37||38||39||40||41||42||43||44)) // jesli jest w 5.wierszu
		{
			while(s[i]==(s[i+9]||s[i+18]||s[i+27]||s[i+36]||s[i-36]||s[i-27]||s[i-18]||s[i-9]))
			{
				s[i]+=1;
				a=0;
				c=0;
			}
		}
		if(i==(45||46||47||48||49||50||51||52||53)) //jesli jest w 6. wieszu
		{
			while(s[i]==(s[i+9]||s[i+18]||s[i+27]||s[i-45]||s[i-36]||s[i-27]||s[i-18]||s[i-9]))
			{
				s[i]+=1;
				a=0;
				c=0;
			}
		}
		if(i==(54||55||56||57||58||59||60||61||62)) //jesli jest w 7. wierszu
		{
			while(s[i]==(s[i+9]||s[i+18]||s[i-54]||s[i-45]||s[i-36]||s[i-27]||s[i-18]||s[i-9]))
			{
				s[i]+=1;
				a=0;
				c=0;
			}
		}
		if(i==(63||64||65||66||67||68||69||70||71)) //jesli jest w  8. kolumnie
		{
			while(s[i]==(s[i+9]||s[i-63]||s[i-54]||s[i-45]||s[i-36]||s[i-27]||s[i-18]||s[i-9]))
			{
				s[i]+=1;
				a=0;
				c=0;
			}
		}
		if(i==(72||73||74||75||76||77||78||79||80)) // jesli jest w 9.kolumnie
		{
			while(s[i]==(s[i-72]||s[i-63]||s[i-54]||s[i-45]||s[i-36]||s[i-27]||s[i-18]||s[i-9]))
			{
				s[i]+=1;
				a=0;
				c=0;
			}
		}
		/*******sprawdza  w kwadracie****/
		if(i==(0||3||6||27||30||33||54||57||60))//jesli jest w lewym górnym rogu kwadratu
		{
			while(s[i]==(s[i+1]||s[i+2]||s[i+9]||s[i+10]||s[i+11]||s[i+18]||s[i+19]||s[i+20]))
			{
				s[i]+=1;
				a=0;
				b=0;
			}
		}
		if(i==(1||4||7||28||31||34||55||58||61))//jesli jest na srodku gory kwadratu
		{
			while(s[i]==(s[i-1]||s[i+1]||s[i+8]||s[i+9]||s[i+10]||s[i+17]||s[i+18]||s[i+19]))
			{
				s[i]+=1;
				a=0;
				b=0;
			}
		}
		if(i==(2||5||8||29||32||35||56||59||62))// jesli jest w  prawym gornym rogu kwadratu
		{
			while(s[i]==(s[i-2]||s[i-1]||s[i+7]||s[i+8]||s[i+9]||s[i+16]||s[i+17]||s[i+18]))
			{
				s[i]+=1;
				a=0;
				b=0;
			}
		}
		if(i==(9||12||15||36||39||42||63||66||69))//jesli jest w lewym srodku kwadratu
		{
			while(s[i]==(s[i-9]||s[i-8]||s[i-7]||s[i+1]||s[i+2]||s[i+9]||s[i+10]||s[i+11]))
			{
				s[i]+=1;
				a=0;
				b=0;
			}
		}
		if(i==(10||13||16||37||40||43||64||67||70))//jesli jest w srodku kwadratu
		{
			while(s[i]==(s[i-10]||s[i-9]||s[i-8]||s[i-1]||s[i+1]||s[i+8]||s[i+9]||s[i+10]))
			{
				s[i]+=1;
				a=0;
				b=0;
			}
		}
		if(i==(11||14||17||38||41||44||65||68||71))//jesli jest w prawym srodku kwadratu
		{
			while(s[i]==(s[i-11]||s[i-10]||s[i-9]||s[i-2]||s[i-1]||s[i+7]||s[i+8]||s[i+9]))
			{
				s[i]+=1;
				a=0;
				b=0;
			}
		}
		if(i==(18||21||24||45||48||51||72||75||78))//jesli jest w  lewym dolnym rogu kwadratu
		{
			while(s[i]==(s[i-18]||s[i-17]||s[i-16]||s[i-9]||s[i-8]||s[i-7]||s[i+1]||s[i+2]))
			{
				s[i]+=1;
				a=0;
				b=0;
			}
		}
		if(i==(19||22||25||46||49||52||73||76||79))//jesli jest  w dolnym srodku kwadratu
		{
			while(s[i]==(s[i-19]||s[i-18]||s[i-17]||s[i-10]||s[i-9]||s[i-8]||s[i-1]||s[i+1]))
			{
				s[i]+=1;
				a=0;
				b=0;
			}
		}
		if(i==(20||23||26||47||50||53||74||77||80))//jesli jest w prawym dolnym rogu
		{
			while(s[i]==(s[i-20]||s[i-19]||s[i-18]||s[i-11]||s[i-10]||s[i-9]||s[i-2]||s[i-1]))
			{
				s[i]+=1;
				a=0;
				b=0;
			}
		}
	}
}

int main(int argc, char** argv)
{
	cout<<"ustal cyfry:"<<endl;
	for(i=0; i<81; ++i)
	{
	cin>>s[i];
	w[i]=s[i];
	if ( (i==8) || (i==17) || (i==26) || (i==35) || (i==44) || (i==53) || (i==62) || (i==71) ||(i==80) )
		{
		cout<<s[0]<<s[1]<<s[2]<<"|"<<s[3]<<s[4]<<s[5]<<"|"<<s[6]<<s[7]<<s[8] <<endl  // wyswietla sudoku
			<<s[9]<<s[10]<<s[11]<<"|"<<s[12]<<s[13]<<s[14]<<"|"<<s[15]<<s[16]<<s[17]<<endl
			<<s[18]<<s[19]<<s[20]<<"|"<<s[21]<<s[22]<<s[23]<<"|"<<s[24]<<s[25]<<s[26]<<endl
			<<"-----------"<<endl
			<<s[27]<<s[28]<<s[29]<<"|"<<s[30]<<s[31]<<s[32]<<"|"<<s[33]<<s[34]<<s[35]<<endl
			<<s[36]<<s[37]<<s[38]<<"|"<<s[39]<<s[40]<<s[41]<<"|"<<s[42]<<s[43]<<s[44]<<endl
			<<s[45]<<s[46]<<s[47]<<"|"<<s[48]<<s[49]<<s[50]<<"|"<<s[51]<<s[52]<<s[53]<<endl
			<<"-----------"<<endl
			<<s[54]<<s[55]<<s[56]<<"|"<<s[57]<<s[58]<<s[59]<<"|"<<s[60]<<s[61]<<s[62]<<endl
			<<s[63]<<s[64]<<s[65]<<"|"<<s[66]<<s[67]<<s[68]<<"|"<<s[69]<<s[70]<<s[71]<<endl
			<<s[72]<<s[73]<<s[74]<<"|"<<s[75]<<s[76]<<s[77]<<"|"<<s[78]<<s[79]<<s[80]<<endl;
		}
	
    }
	cout<<"Zacznamy rozwiazywanie"<<endl;
	for(i=0; i<81 ; ++i)
	{
		if(w[i]==0)	
		{
			roz(i);
			if(s[i]==10)
			{
				s[i]=0;
				for(d=i;w[d]>0;++d)	;
				i-=d;
			}
		}
	}
	cout<<s[0]<<s[1]<<s[2]<<"|"<<s[3]<<s[4]<<s[5]<<"|"<<s[6]<<s[7]<<s[8] <<endl  // wyswietla sudoku
			<<s[9]<<s[10]<<s[11]<<"|"<<s[12]<<s[13]<<s[14]<<"|"<<s[15]<<s[16]<<s[17]<<endl
			<<s[18]<<s[19]<<s[20]<<"|"<<s[21]<<s[22]<<s[23]<<"|"<<s[24]<<s[25]<<s[26]<<endl
			<<"-----------"<<endl
			<<s[27]<<s[28]<<s[29]<<"|"<<s[30]<<s[31]<<s[32]<<"|"<<s[33]<<s[34]<<s[35]<<endl
			<<s[36]<<s[37]<<s[38]<<"|"<<s[39]<<s[40]<<s[41]<<"|"<<s[42]<<s[43]<<s[44]<<endl
			<<s[45]<<s[46]<<s[47]<<"|"<<s[48]<<s[49]<<s[50]<<"|"<<s[51]<<s[52]<<s[53]<<endl
			<<"-----------"<<endl
			<<s[54]<<s[55]<<s[56]<<"|"<<s[57]<<s[58]<<s[59]<<"|"<<s[60]<<s[61]<<s[62]<<endl
			<<s[63]<<s[64]<<s[65]<<"|"<<s[66]<<s[67]<<s[68]<<"|"<<s[69]<<s[70]<<s[71]<<endl
			<<s[72]<<s[73]<<s[74]<<"|"<<s[75]<<s[76]<<s[77]<<"|"<<s[78]<<s[79]<<s[80]<<endl;
}

Ma ktoś pomysł co zrobiłem źle??

0

W jakim sensie zapaliła się klawiatura?

2

Kazdy taki if (i == (a || b || c || d || e ... ) redukuje Ci sie do if (i == 1) jesli przynajmniej jedno z a,b,c..., nie jest równe 0.

1

Nie, w żadnym wypadku if (x == (a || b)) nie jest tym samym co if (x == a || x == b).

0

Lepiej zamiast zmieniać to wszędzie, zapoznaj się z działaniem operatora modulo i pętli for(i uważaj przy tym na średniki, bo średnik oznacza koniec instrukcji, również koniec instrukcji pętli - for(); prawdopodobnie nie jest dobrym pomysłem)
Przykładowo to co chciałeś osiągnąć przez if(i==(0||9||18||27||36||45||54||63||72)), a więc sprawdzenie czy i przyjmuje którąś z tych wartości można zapisać jako if(i % 9 == 0)

0

Kolega kiedyś się nudzil i napisał artykuł o tym, oraz program (na dość mało popularny system, ale przecież chodzi o wydobycie algorytmu)
http://krashan.ppa.pl/articles/sudominator/

0
kempusss napisał(a):

W jakim sensie zapaliła się klawiatura?

To była ironia, informująca o tym, ze piszesz za dużo źle.

Najważniejsze problemy:

  1. brak znajomość składni języka! Takie coś nie ma prawa działać: if(i==(0||9||18||27||36||45||54||63||72));, tu masz co najmniej dwa poważne błędy składniowe
  2. liczby magiczne! Zwłaszcze te używane w indeksach. Tak się nie robi. Jak robisz operacje na tablicach to używasz pętli
  3. nadmiar zmiennych globalnych

IMO daruj sobie na razie rozwiązywanie SUDOKU. Przy obecnym poziomie twoich umiejętności nic z tego nie będzie.
Najlepiej wróć do Grębosza i czytaj go od początku, pisząc równocześnie małe programiki (mniejsze niż ten, najlepiej te, które zaleca Grębosz).

W kompilatorze włącz sobie opcję -Wall, która wykryje większość błędów, które obecnie popełniasz.

http://melpon.org/wandbox/permlink/H8Ni50JjuGCyzisj

prog.cc17: warning: use of logical '||' with constant operand [-Wconstant-logical-operand]
if(i==(0||9||18||27||36||45||54||63||72)); //jesli jest w pierwszej kolumnie
^ ~
prog.cc17: note: use '|' for a bitwise operation
if(i==(0||9||18||27||36||45||54||63||72)); //jesli jest w pierwszej kolumnie
^~~
|
prog.cc50: warning: if statement has empty body [-Wempty-body]
if(i==(0||9||18||27||36||45||54||63||72)); //jesli jest w pierwszej kolumnie
^
prog.cc50: note: put the semicolon on a separate line to silence this warning
prog.cc90: warning: while loop has empty body [-Wempty-body]
while(s[i]==(s[i+1]||s[i+2]||s[i+3]||s[i+4]||s[i+5]||s[i+6]||s[i+7]||s[i+8]));
^
prog.cc90: note: put the semicolon on a separate line to silence this warning
prog.cc18: warning: use of logical '||' with constant operand [-Wconstant-logical-operand]
if (i==(1||10||19||28||37||46||55||64||73)); //jesli jest w 2. kolumnie
^ ~~
prog.cc18: note: use '|' for a bitwise operation
if (i==(1||10||19||28||37||46||55||64||73)); //jesli jest w 2. kolumnie
^~~~
|
prog.cc52: warning: if statement has empty body [-Wempty-body]
if (i==(1||10||19||28||37||46||55||64||73)); //jesli jest w 2. kolumnie
^
prog.cc52: note: put the semicolon on a separate line to silence this warning
prog.cc90: warning: while loop has empty body [-Wempty-body]
while(s[i]==(s[i+1]||s[i+2]||s[i+3]||s[i+4]||s[i+5]||s[i+6]||s[i+7]||s[i-1]));
^
prog.cc90: note: put the semicolon on a separate line to silence this warning
prog.cc17: warning: use of logical '||' with constant operand [-Wconstant-logical-operand]
if(i==(2||11||20||29||38||47||56||65||74)) //jesli jest w 3. kolumnie
^ ~~

… …

0

@kempusss a teraz wprowadź małe poprawki do kodu:

  • niech plansza będzie NxN
  • niech rozmiar małych kwadratów będzie MxM gdzie oczywiście M*M = N
  • niech zestaw liczb będzie 0..N

Czy przy takich założeniach napisałbyś ten kod tak samo? Nie? No właśnie.

0

A czy jest sposób, by sprawdzić czy któryś element tablicy == a?
Wiem, że można po prostu po kolei sprawdzać wartości w tablicy, ale może jest jakiś sposób by zrobić to szybciej?

0

Na obecny twój poziom umiejętności, najlepiej odpowiedzieć ci: "nie da się".
Naprawdę zacznij od opanowania podstaw. Wróć do czytania Grębosza, czy co tam używasz do nauki i zacznij od pisania prostszych programów, takich w których wystarczą 3 pętle i 3 if-y.

3

A czy jest sposób, by sprawdzić czy któryś element tablicy == a?

To się robi po prostu w pętli. Dla 10 elementów angażowanie zaawansowanych algorytmów wyszukiwania jest zupełnie pozbawione sensu.

0

Na razie spróbowałem zrobić coś prostszego.
Zrobiłem program do sudoku 4x4 i mam mały problemik.
Program działa i rozwiązuje, ale nie nie mam pomysłu jak określić ostatni brakujące pole przy sprawdzaniu w kwadracie.
oto kod

#include <iostream>
#include <conio.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
int i,j;
int d;//zmienna do ustalenia wielkosci w sud
int sud[4][4]={0};//plansza do sudoku
int pocz[4][4];//początkowa wartosc sud
void rysuj()//rysuje sudoku
{
	cout<<endl;
	cout<<" |"<<sud[0][0]<<sud[0][1]<<"|"<<sud[0][2]<<sud[0][3]<<"|"<<endl;
	cout<<" |"<<sud[1][0]<<sud[1][1]<<"|"<<sud[1][2]<<sud[1][3]<<"|"<<endl;
	cout<<" |-----|"<<endl;
	cout<<" |"<<sud[2][0]<<sud[2][1]<<"|"<<sud[2][2]<<sud[2][3]<<"|"<<endl;
	cout<<" |"<<sud[3][0]<<sud[3][1]<<"|"<<sud[3][2]<<sud[3][3]<<"|"<<endl;
	
}
int roz (int i,int j)
{
	if(pocz[i][j]==0)//czy pole było puste
	{
		d=sud[i][j];//d jest rowne poczatkowej wartosci sud
		++d;//zwiekszamy o  1(aby nie bylo rowne 0)
		while(d==sud[i][0]||d==sud[i][1]||d==sud[i][2]||d==sud[i][3]||d==sud[0][j]||d==sud[1][j]||d==sud[2][j]||d==sud[3][j])//sprawdza w kolumnie wierszu i kwadracie
		{
			++d;//zwiekszenie d, jesli sie nie zgadza
		}
		return d;//zwraca d
	}
}
	
main() 
{
	cout<<"ustal cyfry"<<endl;
	for(i=0;i<4;++i)//dla kazdego wiersza
	{
		cin>>sud[i][0]>>sud[i][1]>>sud[i][2]>>sud[i][3];//ustala wartosci sud
		for(j=0;j<4;++j)
		{
			pocz[i][j]=sud[i][j]; //ustala poczatkowa wartosc sud
		}
	}
	rysuj();//rysuje sudoku
	/*zaczynamy sprawdzanie*/
	for(i=0;i<4;++i)//ustawia wiersz
	{
		for(j=0;j<4;++j)//ustawia pozycje w  wierszu
		{
			sud[i][j]=roz(i,j);//sprawdza waatosc i pod
			stawia 
			if(sud[i][j]>4)//jesli popelnil wczesniej blad
			{
				j-=2;//zmiejscza miejsce w  wierszu
				if(j<0)//jezeli blad byl  w wyzszym wierszu
				{
					j=4;//ustala j na ostatnie miejsce w  wierszu
					--j;//zmiejsza wiersz
				}
			}
		}
	}
	cout<<"rozwiazane sudoku:"<<endl;
	rysuj();
}
 
0

@kempusss guzik a nie prostszego. Piszesz to samo, tak samo źle, tylko okroiłeś sobie przypadek. Nie tędy droga. Skasuj to i napisz od nowa, w wersji NxN takiej jak opisałem wyżej. Bo mam wrażenie że to jedyny sposób żebyś właczył myślenie.

0

Zacznij od pisania mniejszych programów składających się z 3 pięciowierszowych funkcji.

1

Udało mi w końcu skończyć ten program(finalnie na zasadach ustalonych przez Shalom)
Dziękuję wszystkim, którzy mi pomogli.
Opinie na temat kodu mile widziane :)
A oto kod:

#include <iostream>
#include<vector>
#include<conio.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
int szer;//szerokosc sudoku
int i,j;
int o=0;
int w;//wartosc sud w funkcji
int k;//szerokosc kwadratu
vector<vector<int> >sud;
vector<vector<int> >spr;
void rysuj()
{
	for(i=0;i<szer;++i)
	{
		cout<<" "<<endl;
		for(j=0;j<szer;++j)
		{
			cout<<sud[i][j];
			if(j%k==(k-1))
				cout<<"|";
		}
		if(i%k==(k-1))
		{
			cout<<endl;
			for(j=0;j<(szer+k);++j)
			cout<<"-";	
		}	
	}
	cout<<endl;
}
bool sprW(int x,int y, int w)
{
	for(int n=0;n<szer;++n)
	{
		if(w==sud[x][n]||w==sud[n][y]||w==sud[x/k*k+n/k][y/k*k+n%k])
		{
			return true;
		}
	}
	return false;
}
int roz(int i, int j)
{
	w=sud[i][j];
	if(spr[i][j]==0)
	{
		++w;
		while(sprW(i,j,w)==true)
		{
			++w;
			++o;
		}
	}
	return w;
}
int main() 
{
	cout<<"podaj szerokosc kwadratu: ";
	cin>>szer;
	k=szer;
	szer*=szer;
	/*ustala tablice*/
	sud.resize(szer);
	for(i=0;i<sud.size();++i)
		sud[i].resize(szer);
	/*skonczyl ustalac tablicę*/
	/*ustala tablicę sprawdzającą*/
	spr.resize(szer);
	for(i=0;i<szer;++i)
		spr[i].resize(szer);
	/*kończy ustalać tablicę sprawdzającą*/
	cout<<"podaj cyfry:"<<endl;
	for(int i=0;i<szer;++i)		
	{
		for(int j=0;j<szer;++j)
		{
			cout<<"wiersz: "<<i+1<<" kolumna: "<<j+1<<endl;
			cin>>sud[i][j];		//ustalamy liczby
			spr[i][j]=sud[i][j];//ustalamy liczby  w tablicy sprawdzającej
			rysuj();
		}
		
	}
	cout<<"Zaczynamy rozwiazywanie"<<endl;
	for(int i=0;i<szer;++i)
	{
		for(int j=0;j<szer;++j)
		{
			sud[i][j]=roz(i,j);
			if(sud[i][j]>szer)
			{
				sud[i][j]=0;
				j-=2;
				if(j<-1)
					{
						--i;
						j=szer-2;
					} 
				while(spr[i][j+1]>0)
				{
					--j;				
					if(j<-1)
					{
						--i;
						j=szer-2;
					}
				}
			}
		}
	}
	cout<<"Rozwiazane sudoku w "<<o<<" operacji:"<<endl;
	rysuj();
	getch();
} 
1

zle nie jest, ale nadal duzo mozna poprawic w tym kodzie.
Najwazniejsze zrobiles. Jest uniwersalny
Teraz musisz zrobic go czytelnym

2

@kempusss pokaż to swojej mamie / siostrze:

    for(int i=0;i<szer;++i)
    {
        for(int j=0;j<szer;++j)
        {
            sud[i][j]=roz(i,j);
            if(sud[i][j]>szer)
            {
                sud[i][j]=0;
                j-=2;
                if(j<-1)
                    {
                        --i;
                        j=szer-2;
                    } 
                while(spr[i][j+1]>0)
                {
                    --j;                
                    if(j<-1)
                    {
                        --i;
                        j=szer-2;
                    }
                }
            }
        }
    }

I spytaj czy zgadną co ten kod robi. Powtarzaj to dopóki nie zgadną, wtedy będzie to znaczyło że kod jest czytelny. A gdyby ten kod wyglądał np. tak:

//
SudokuCell previousCell = null;
while(notSolved(sudoku)){
    previousCell = tryToSolveNextEmptyCell(sudoku, previousCell);
}
//

SudokuCell tryToSolveNextEmptyCell(Sudoku sudoku, SudokuCell previousCell){
    SudokuCell cell = getNextEmptyCell(sudoku, previousCell);
    trySolving(cell);
    return cell;
}

void trySolving(SudokuCell cell){
    trySolvingInSmallSquare(cell);
    trySolvingInHorizontalLine(cell);
    trySolvingInverticalLine(cell);
}

i tak dalej...

0

Kolejna wersja kodu.
Wiem że mogłem zmienić końcówkę w rozwiazSudoku(), ale nie miałem pomysłu jak.
Jak zwykle mile widziane komentarze :).

 #include <iostream>
#include<vector>
#include<conio.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
int szer;//szerokosc sudoku
int i,j;//pierwsza i druga współrzędna
int licznik=0;
int w;//wartosc sud w funkcji
int k;//szerokosc kwadratu
vector<vector<int> >sud;
vector<vector<int> >spr;
void rysujCyfre() 
{
cout<<sud[i][j];
}
void rysujPion()
{
	if(j%k==(k-1))
		cout<<"|";	
}
void rysujPoziom()
{
	if(i%k==(k-1))
		{
			cout<<endl;
			for(j=0;j<(szer+k);++j)
			cout<<"-";
		}
}
void rysuj()
{
	for(i=0;i<szer;++i)
	{
		cout<<" "<<endl;
		for(j=0;j<szer;++j)
		{
			rysujCyfre(); 
			rysujPion();
		}
			rysujPoziom();
	}
	cout<<endl;
}
void ustalWielkoscTablicySud()
{
	sud.resize(szer);
	for(i=0;i<sud.size();++i)
		sud[i].resize(szer);
}
void ustalWielkoscTablicySpr()
{
	spr.resize(szer);
	for(i=0;i<szer;++i)
		spr[i].resize(szer);
}
void ustalCyfrySud()
{
cout<<"podaj cyfry:"<<endl;
	for(int i=0;i<szer;++i)		
	{
		for(int j=0;j<szer;++j)
		{
			cout<<"wiersz: "<<i+1<<" kolumna: "<<j+1<<endl;
			cin>>sud[i][j];		
			spr[i][j]=sud[i][j];//ustalamy liczby  w tablicy sprawdzającej
			rysuj();
		}
		
	}	
}
void ustalSzerokosc()
{
	cout<<"podaj szerokosc kwadratu: ";
	cin>>szer;
	k=szer;
	szer*=szer;
}

bool sprW(int x,int y, int w)
{
	for(int n=0;n<szer;++n)
	{
		if(w==sud[x][n]||w==sud[n][y]||w==sud[x/k*k+n/k][y/k*k+n%k])
		{
			return true;
		}
	}
	return false;
}
int roz(int i, int j)
{
	w=sud[i][j];
	if(spr[i][j]==0)
	{
		++w;
		while(sprW(i,j,w)==true)
		{
			++w;
			++licznik;
		}
	}
	return w;
}
bool sprawdzRozwiazanie(int i, int j)
{
	if(sud[i][j]>szer)
	return true;
	else return false;
}

void ustalSudoku()
{
	ustalSzerokosc();
	ustalWielkoscTablicySud();
	ustalWielkoscTablicySpr();
	ustalCyfrySud();
}

void rozwiazSudoku()
{
	cout<<"Zaczynamy rozwiazywanie"<<endl;
	for(int i=0;i<szer;++i)
	{
		for(int j=0;j<szer;++j)
		{
			sud[i][j]=roz(i,j);
			if(sprawdzRozwiazanie(i,j))
			{
				sud[i][j]=0;
				j-=2;	//ustal j tak, aby przy kolejnym obrocie byl= -1
				if(j<-1) //jesli po obrocie bedzie ujemne
					{
						--i; //zmiejsz i (wiersz) o jeden
						j=szer-2; //ustaw j na ostatni
					} 
				while(spr[i][j+1]>0) //jesli na polu sud[i][j] jest niezmienna wartosc
				{
					--j;	//zmiejsz j 
					if(j<-1)//patrz wczesniejsze if
					{
						--i;
						j=szer-2;
					}
				}
			}
		}
	}
	cout<<"Rozwiazane sudoku w "<<licznik<<" operacji:"<<endl;
}
int main() 
{
	ustalSudoku();
	rozwiazSudoku();
	rysuj();
	getch();
}
0
  1. Zmienne globalne? o_O
  2. Chcesz powiedzieć że twoja młodsza siostra rozumie co robi funkcja rozwiazSudoku? Bo ja na przykład nie rozumiem.
  3. Tak samo zresztą jak sprW czy roz
    Tylko main i ustalSudoku wyglądają teraz po ludzku, od biedy też te zmiany rozmiary i rysowanie planszy chociaż nie rozumiem czemu chcesz skracać nazwy. Funkcja rysujPion() rysuje pionową kreskę a nie pion. Tak samo ustalCyfrySud w rzeczywistości wczytuje liczby do sudoku...

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