?
OK ich habs jetzt mit ner schleife gelöst aber das prog arbeitet trotzdem nicht findet ihr den Fehler???
#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;
}
}
}
ist meine lösung die vorgaben sind :
#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
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);
danke