• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

spoj SUDOKUC - Sprawdzanie sudoku

VPS Starter Arubacloud
0 głosów
1,855 wizyt
pytanie zadane 12 lutego 2017 w C i C++ przez tfwnogf Nowicjusz (150 p.)

Mam problem z tym http://pl.spoj.com/problems/SUDOKUC/ zadaniem na spoju. Jak sprawdzam lokalnie to działa, a sędzia odrzuca. Myślałem że może z endlajnami coś nie tak, ale nie mogłem znaleźć błędu.

#include <iostream>


using namespace std;

bool check(int tab[9][9]); //sprawdzanie sudoku

////////////////////////////////////////////////////////////////////////////////
int main()
{
	int t;
	cin >> t;
	for (int x = 0; x < t; x++)
	{
		int tab[9][9];// = { {2, 5, 1, 7, 6, 9, 3, 4, 8,}, {9, 8, 6, 3, 4, 5, 2, 7, 1}, {3, 7, 4, 8, 2, 1, 6, 9, 5}, {4, 2, 9, 6, 3, 8, 5, 1, 7},
		//{8, 6, 3, 5, 1, 7, 9, 2, 4}, {5, 1, 7, 4, 9, 2, 8, 3, 6}, {7, 9, 5, 1, 8, 3, 4, 6, 2}, {1, 4, 2, 9, 5, 6, 7, 8, 3,}, {6, 3, 8, 2, 7, 4, 1, 5, 9} };
		
		for (int i = 0; i < 9; i++) //zapełnianie tablicy
		{
			for (int j = 0; j < 9; j++)
			{
				cin >> tab[i][j];
			}
		}

		bool ans = 0;
		ans = check(tab);
		if (ans == 1) cout << "TAK";
		else cout << "NIE";
		cout << endl;
	}

    return 0;
}
////////////////////////////////////////////////////////////////////////////////////
bool check(int tab[9][9])
{
	int suma = 0;
	for (int i = 0; i < 9; i++)
	{
		for (int j = 0; j < 9; j++)
		{
			suma += tab[i][j];
			if (j == 8 && suma != 45) return 0; //jezeli suma cyfr w jednym bloku jest różna od 45 zwraca false
		}
	}
	for (int i = 0; i < 9; i++)
	{
		for (int j = 0; j < 9; j++)
		{
			suma += tab[j][i];
			if (j == 8 && suma != 45) return 0;//j.w.
		}
	}
	return 1;//jeżeli wlyniki się zgadzały zwraca true
}

 

komentarz 14 lutego 2017 przez tfwnogf Nowicjusz (150 p.)
edycja 14 lutego 2017 przez tfwnogf

Poprawiłem kod, dodałem funkcje sprawdzające powtarzalność cyfr w kolumnach, wierszach i kwadratach 3x3, ale wciąż jest problem.

bool square(int tab[9][9])
{
    int suma = 0;
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            for (int a = (3 * i); a < (3 * i + 3); a++)
            {
                for (int b = (3 * j); b < (3 * j + 3); b++)
                {
                    suma += tab[a][b];
                //    cout << "tab[" << a << "][" << b << "] = " << tab[a][b] << endl;
                //    cout << "[a = " << a << "] [(a = 3*i) = " << 3*i <<  "] [(a = (3 * i + 2) = " << (3 * i + 2) <<"]" << endl;
                //    cout << "[b = " << b << "] [(b = 3*j) = " << 3 * j << "] [(b = (3 * j + 2) = " << (3 * j + 2) << "]" << endl;
                //    cout << "Suma = " << suma << endl;
                    if (a == (3 * i + 2) && b == (3 * j + 2) && suma != 45) return 0;
                //    cin.get();
                }
            }
            suma = 0;
        }
    }
    return 1;
}
bool vert(int tab[9][9])
{
	for (int x = 0; x < 9; x++)
	{
		for (int i = 0; i < 9; i++)
		{
			for (int j = 8; j >= 0; j--)
			{
				if (j == i) break;
			//	cout << "tab[" << x << "][" << i <<"] = " << tab[x][i] << endl;
			//	cout << "tab[" << x << "][" << j << "] = " << tab[x][j] << endl;
			//	cout << endl;
				if (tab[x][i] == tab[x][j]) return 0; //sprawdzanie wierszy
				if (tab[i][x] == tab[j][x]) return 0;//sprawdzanie kolumn
				
			}
		}
	}
	return 1;

}

Wiem że w kwadratach 3x3  chodzi o to aby cyfry nie powtarzały się, ale z sprawdzenie powtarzalności cyfr w wierszach i kolumnach odpowiedzialna jest inna funkcja. Sądzę że jeśli funkcja vert nie zwraca błędu to cyfry muszą być różne w każdym wierszu i kolumnie, a co za tym idzie również w każdym kwadracie. Więc sprawdzam tylko sumę w każdym kwadracie.

Ewentualnie może w zły sposób podaje odpowiedzi sędziemu:

if (!suma(tab)) cout << "NIE";
		else if (!wiersze_kolumny(tab)) cout << "NIE";
		else if (!square(tab)) cout << "NIE";
		else cout << "TAK";
		cout << endl;

Proszę o pomoc :)

1 odpowiedź

0 głosów
odpowiedź 12 lutego 2017 przez Dexterim Dyskutant (8,370 p.)
wybrane 13 lutego 2017 przez tfwnogf
 
Najlepsza
Prawdopodobnie błąd masz w funkcji bo po przejściu przez pierwszą pętle nie zerujesz sumy. To co na pierwszy rzut oka dostrzegłem
komentarz 13 lutego 2017 przez tfwnogf Nowicjusz (150 p.)
dzięki, poprawiłem i ta funkcja już działa :).

Zrobiłem kolosalny błąd zakładając że wystarczy aby w każdym z bloków suma wynosiła 45, a przecież w sudoku cyfry w jednym bloku nie mogą się powtarzać. Dlatego sędzia nawet po poprawie funkcji check nadal wyrzuca błąd.

Podobne pytania

0 głosów
1 odpowiedź 178 wizyt
pytanie zadane 25 kwietnia 2020 w SPOJ przez Noseczek12 Użytkownik (550 p.)
0 głosów
0 odpowiedzi 184 wizyt
pytanie zadane 24 września 2019 w C i C++ przez magda_19 Gaduła (3,080 p.)
0 głosów
2 odpowiedzi 5,302 wizyt
pytanie zadane 28 kwietnia 2016 w C i C++ przez drive879 Nowicjusz (160 p.)

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...