Soduku-Löser

ReVonX

Grünschnabel
Ich arbeite gerade an einem Programm für die Lösung eines Soduku-Lösers ! Ich brauche eine Abfrage um zuprüfen ob sich die eingegebene Zahl zwischen 1 und 9 befinden wenn ja soll "zulässig" wenn nicht "unzulässig" ausgegeben werden! Im weiteren soll geprüft werden ob sich es bei der Eingabe vielleicht um einen Buchstaben handelt!

Kann mir jemand weiter helfen.:confused:
 
Hallo!

Du gibst etwas wenig Infos.
In C/C++ kannst Du das so machen:

Lese den Inhalt des Eingabefelds in eine Variable char [] strText ein:

int iValue = atoi(strText);
if((iValue > 0) && (iValue <= 9))
{
// dann eine Zahl zwischen 1 und 9
}
else
{
sonst wurde keine Zahl oder eine andere Zahl ausser 1,....,9 eingegeben
}


Reicht das?


Was mich interessieren würde:

Erkennt Dein Sudokulöser auch, ob das Sudoku nur eine oder mehrere Lösungen hat?

Grüße,

giofyxle
 
Ok das versuch ich mal!
Da es zuwenig Infos waren hier mal der Lösungsansatz:
Code:
#include <cstdlib>
#include <iostream>

using namespace std;

//Funktionsprototypen
void eingabe (void);

int Feld [9][9];


//Funktionsdefinitionen
void eingabe ()
{
      for (int i = 0; i <=8; i++ )
    {
          
          for (int j = 0; j <= 8; j++)
              {
                cout << "Bitte geben sie die " << (j+1) << ". Zahl der " << (i+1) << ". Reihe ein!" << endl;
                cin >> (Feld[i] [j]);       
              }
           
    }
    
    cout << endl;
}

// Definition der Variablen
int sudoku[9][9] = {0};

// Definition der Funktionsprototypen
int Gueltigkeit_pruefen(int, int, int);

// Funktionsdefinition für die Prüfung der Felder
int Gueltigkeit_pruefen(int Zeile, int Spalte, int Zu_pruefende_Zahl)
{
    for (int i=0;i<8;i++)
     {
             if(Zu_pruefende_Zahl == sudoku [i] [Spalte])
              {
               return 0;
              }
     }
     
     for (int i=0;i<8;i++)
     {
             if(Zu_pruefende_Zahl == sudoku [Zeile] [i])
              {
               return 0;                         
              }
     }     
     return 1;
}



//Aufruf Hauptprogramm
int main()
{
    char f = 'n';

  void eingabe();
    while ( f=='n')
    {
    
   int Zahl = 0;
   int Z = 0;
   int S = 0;
   cout << "Geben Sie eine Zahl ein, die auf Gueltigkeit geprueft werden soll!\n";
   cin >> Zahl;
   cout << "Geben Sie im Folgenden die Position der Zahl an: \n";
   cout << "Zeile : ";
   cin >> Z;
   cout << "Spalte: ";
   cin >> S;
      
   // Prüfung der eingegebenen Zahl aufrufen:
   int OK = 0;
   OK = Gueltigkeit_pruefen (Z-1,S-1,Zahl);
   
   // Ergebnis ausgeben:
   if ( OK == 1 )
    cout <<"Zahl zulaessig!\n";
   else
    cout <<"Zahl nicht zulaessig!\n";  
    
   //Anfang der Ausgabe in Tabelle!
   
    cout << "+------------------------------------------------------------------------+" << endl;
    
    for (int i=0; i <= 8; i++)
     {
         cout << "| " << int (Feld[i][0]) 
              << "\t |  " << int (Feld[i][1])  << "\t |  " << int (Feld[i][2]) 
              << "\t |  " << int (Feld[i][3])  << "\t |  " << int (Feld[i][4]) 
              << "\t |  " << int (Feld[i][5]) << "\t |  " << int (Feld[i][6]) << "\t |  "
              << int (Feld[i][7]) << "\t  |  " << int (Feld[i][8]) << "\t |  " << endl;
         cout << "+------------------------------------------------------------------------+" << endl;     
     }
    
    //Abfrage ob Angaben korrekt sind!
    cout << "Sind ihre Angaben korrekt? (y / n)" << endl;
    cin >> f;
    } 
    

    
    
    system("PAUSE");
    return EXIT_SUCCESS;
}

Ob das Programm erkennen kann ob es eine oder mehrere Lösungen gibt darüber hab ich noch nicht nachgedacht aber die Idee ist gut!

Gruß ReVonX
 
Hallo,

also wenn dein Programm die Sudokus selbst generiert, dann musst du einfach noch soviele Zahlen anzeigen, dass das Sudoku noch eindeutig ist.
Ein Bekannter von mir hat es so gemacht. Sein Programm generiert sich komplette Sudokus und lässt dann einfach Zahlen weg. Lässt aber noch soviele Zahlen da, dass es noch eindeutig zu lösen ist.
Wenn du das genau so löst, hast du das Problem mir der Prüfung nicht mehr, ob es mehrere Lösungen gibt.

MFG

zEriX
 
Vielen Dank für eure Tipps aber wirklich weitergeholfen haben sie mir bisher nicht.
Hier die neue Version des Programmes. Problem ist nun nach dem kompilieren geht das Programm sofort zur Ausgabe über und überspring meine Eingabe!!
C++:
#include <cstdlib>
#include <iostream>

using namespace std;

// Definition der Variablen
int sudoku[9][9] = {0};

int Z,S,Zahl;
// Definition der Funktionsprototypen
int Gueltigkeit_pruefen(int, int, int);

//Funktionsprototyp
void ausgabe (void);

//Funktionsprototyp
void eingabe (void);

void ausgabe (void){
int x,y;

    for(int x=0; x!=9; x++)
    {
            for(int y=0; y!=9;y++)
            {
                    cout << sudoku[x][y]<< " ";}
                    cout << "" << endl;
                    }
}



      void eingabe (void) {
      int a,b;
      
    do {
    cout << "Geben Sie eine Zahl für die X-Achse an." << endl;
    cin >> a; 
    cout << "Geben Sie eine Zahl für die Y-Achse an." << endl;
    cin >> b;
    
    cout << "Geben sie eine Zahl ein, die sie in dem Feld haben möchten! (1-9)" << endl;
    cin >> sudoku[a-1][b-1];
    cout << sudoku[a-1][b-1]<< endl;
    cout << "" << endl;
    cout << "Hier sieht man das ganze Sodoku:" << endl;
    
    ausgabe();
    
}
while (sudoku[a-1][b-1]!=0);
}

// Definition der Funktionsprototypen
int Gueltigkeit_pruefen(int, int, int);

// Funktionsdefinition für die Prüfung der Felder
int Gueltigkeit_pruefen(int Zeile, int Spalte, int Zu_pruefende_Zahl)
{
    for (int i=0;i<8;i++)
     {
             if(Zu_pruefende_Zahl == sudoku [i] [Spalte])
              {
               return 0;
              }
     }
     
     for (int i=0;i<8;i++)
     {
             if(Zu_pruefende_Zahl == sudoku [Zeile] [i])
              {
               return 0;                         
              }
     }     
     return 1;
}



//Aufruf Hauptprogramm
int main()
{
 char f;
  void eingabe();

      
   // Prüfung der eingegebenen Zahl aufrufen:
   int OK = 0;
   OK = Gueltigkeit_pruefen (Z-1,S-1,Zahl);
   
   // Ergebnis ausgeben:
   if ( OK == 1 )
    cout <<"Zahl zulaessig!\n";
   else
    cout <<"Zahl nicht zulaessig!\n";  
    
   //Anfang der Ausgabe in Tabelle!
   
    cout << "+------------------------------------------------------------------------+" << endl;
    
    for (int i=0; i <= 8; i++)
     {
         cout << "| " << int (sudoku[i][0]) 
              << "\t |  " << int (sudoku[i][1])  << "\t |  " << int (sudoku[i][2]) 
              << "\t |  " << int (sudoku[i][3])  << "\t |  " << int (sudoku[i][4]) 
              << "\t |  " << int (sudoku[i][5]) << "\t |  " << int (sudoku[i][6]) << "\t |  "
              << int (sudoku[i][7]) << "\t  |  " << int (sudoku[i][8]) << "\t |  " << endl;
         cout << "+------------------------------------------------------------------------+" << endl;     
     }
    
    //Abfrage ob Angaben korrekt sind!
    cout << "Sind ihre Angaben korrekt? (y / n)" << endl;
    cin >> f;
     
    

    
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
 
Zuletzt bearbeitet:
Hi.

Verwende doch bitte die Code-Tags für deinen Quelltext - d.h. du solltest C++ Code in [code=cpp]...[/code] Tags einschließen.. Ich persönlich schaue mir solch unleserlichen Code nicht mehr an.

Gruß
 
Genau das, was ich auch schon gepostet habe, es hat nur anscheinend niemanden erreicht. Ich bin auch der Meinung, dass es einfach sonst zu unuebersichtlich ist!
 
Zurück