Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Wo steckt der Fehler???

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
16.02.2008, 20:24 Uhr
~A.nonym
Gast


Hallo an alle

folgendes:
ich soll ein sudokulöser erstellen
die dateien vorgP4.2.h und vorgP4.2.c++ sind vorgaben die ich nicht ändern darf
in aufgP4.2.c++ hab ich mein programm reingeschrieben nur funktioniert das nicht
es sagt bei einem volen sudoku zwar ob das richtig ist oder nicht aber sobald ich eine 0 (= kein Eintrag) gehts nicht

hier die quell texte:
vorgP4.2.h:

C++:
typedef unsigned char SD [9][9][10];
//SD[i][j][0] ist Anzahl der offenen Möglichkeiten auf Position (i,j)
//SD[i][j][k]==true genau dann wenn die Zahl k eine offene Möglichkeit ist

char sudoku(SD);




vorgP4.2.c++ :

C++:
#include<stdio.h>
#include<stdlib.h>
#include"vorgP4.2.h"
#include<iostream.h>

void lese_SD(SD sd)
{
    unsigned c;
    for(unsigned i=0;i<9;++i)
       for(unsigned j=0;j<9;++j)
       {
          scanf("%u",&c);
          for(unsigned k=1;k<10;++k) sd[i][j][k]=(c?0:1);
          sd[i][j][0]=(c?1:9);
          if(c) sd[i][j][c]=1;
      }
}

void drucke_SD(SD sd)
{
    for(unsigned i=0;i<9;++i)
       {
           for(unsigned j=0;j<9;++j)
           {
               if(sd[i][j][0]!=1) { printf("%u ",0); continue; }
               for(unsigned k=1;k<10;++k)if(sd[i][j][k]) printf("%u ",k);
           }
           printf("\n");
        }
}

SD sd;

main()
{
    lese_SD(sd);
    drucke_SD(sd);
    printf("\n");
    if(sudoku(sd)) drucke_SD(sd);
    else printf("unloesbar");
    system("PAUSE");

}


und schließlich
aufgP4.2.c++ :

C++:
#include "vorgP4.2.h"

char voll(SD sd1)
{
  int rueck=1;
  for(unsigned i=0;i<9;++i)
       {  
           for(unsigned j=0;j<9;++j)
          {
            if(sd1[i][j][0]>1)
            rueck = 0;
          }
       }
    
  return rueck;
}
  
int welche_zahl(SD sd2, int zeile, int spalte)
{
    int rueck=0;
    for (unsigned k=0;k<10;++k)
      if (sd2[zeile][spalte][k]==1) rueck=k;
    return rueck;
}

char teste(SD sd3)
{
    int rueck=1;
    //zeilentest:
     for(unsigned i=0;i<9;++i)
    {  
        for(unsigned j=0;j<9;++j)
       {
          for(unsigned l=0;l<9;++l)
          {
           if ((welche_zahl(sd3,i,j)==welche_zahl(sd3,i,l))&&(j!=l))
           rueck = 0;            
          }                      
       }
    }
    //spaltentest
    for(unsigned j=0;j<9;++j)
    {  
        for(unsigned i=0;i<9;++i)
       {
          for(unsigned l=0;l<9;++l)
          {
           if ((welche_zahl(sd3,i,j)==welche_zahl(sd3,l,j))&&(i!=l))
           rueck = 0;            
          }                      
       }
    }
    //boxtest
    for(unsigned i=0;i<9;++i)
    {  
        for(unsigned j=0;j<9;++j)
       {
        for(unsigned k=((i/3)*3);k<(((i/3)*3)+3);++k)
        {
           for(unsigned l=((j/3)*3);l<(((j/3)*3)+3);++l)
        {
            if ((welche_zahl(sd3,i,j)==welche_zahl(sd3,k,l))&&((i!=k)||(j!=l)))
           rueck = 0;        
        }          
        }                      
       }
    }  
      
    return rueck;
}

int freiezeile(SD sd4)
{
  int rueck;
     for(unsigned i=0;i<9;++i)
       {  
           for(unsigned j=0;j<9;++j)
          {
            if(sd4[i][j][0]>1)
            rueck = i;
          }
       }    
     return rueck;        
}
int freiespalte(SD sd5, int zeile)
{
    int rueck;
     for(unsigned j=0;j<9;++j)
       {  
          if(sd5[zeile][j][0]>1)
            rueck = j;
       }
    
     return rueck;
}  

char sudoku(SD sd)
{
SD sdx;
int wert=0;
// sd auf sdx zuweisen:
for(unsigned i=0;i<9;++i)
    {  
        for(unsigned j=0;j<9;++j)
       {
          for(unsigned k=0;k<10;++k)
          sdx[i][j][k]=sd[i][j][k];
       }
    }
// sind alle einträge im sudoku drin? wenn ja dann prüfe ob diese Lösung so geht      
if (voll(sd)==1)
{
                if(teste(sd)==1)
                {
                                return 1;
                }
                else return 0;
                
}
else
{
// suche nächsten freien Platz

int zeile = freiezeile(sd);
int spalte = freiespalte(sd,zeile);
for(unsigned zahl=0;zahl<9;++zahl)
//trage zahl ein und löse dann
{
     for(unsigned i=1;i<10;++i)
     {
                  sdx[zeile][spalte][i]=0;
     }
     sdx[zeile][spalte][zahl]=1;
     sdx[zeile][spalte][0]=1;
    
     if (sudoku(sdx)==1)
     {
      for(unsigned i=0;i<9;++i)
         {  
           for(unsigned j=0;j<9;++j)
             {
                for(unsigned k=0;k<10;++k)
                  sd[i][j][k]=sdx[i][j][k];
             }
         }
      return 1;
     }
     else
        return 0;            
}
}
}




Danke schonmal an alle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.02.2008, 00:58 Uhr
~a.nonym
Gast


k ich habs denke ich erst mal gefunden

mfg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.02.2008, 21:30 Uhr
~Newmen
Gast


Hi...

Wo genau ist denn der Fehler, kann ihn nicht finden????
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: