Sudoku: Difference between revisions

Content added Content deleted
m (→‎{{header|FutureBasic}}: remove 'dim as' and update millisecond timer)
m (→‎{{header|FutureBasic}}: remove 'dim as')
Line 5,157: Line 5,157:
First is a short version:
First is a short version:
<syntaxhighlight lang="futurebasic">
<syntaxhighlight lang="futurebasic">
include "NSLog.incl"
include "Util_Containers.incl"
include "Util_Containers.incl"


begin globals
begin globals
dim as container gC
container gC
end globals
end globals


BeginCDeclaration
BeginCDeclaration
short solve_sudoku(short i);
short solve_sudoku(short i);
short check_sudoku(short r, short c);
short check_sudoku(short r, short c);
CFMutableStringRef print_sudoku();
CFMutableStringRef print_sudoku();
EndC
EndC


BeginCFunction
BeginCFunction
short sudoku[9][9] = {
short sudoku[9][9] = {
{3,0,0,0,0,1,4,0,9},
{3,0,0,0,0,1,4,0,9},
{7,0,0,0,0,4,2,0,0},
{7,0,0,0,0,4,2,0,0},
{0,5,0,2,0,0,0,1,0},
{0,5,0,2,0,0,0,1,0},
{5,7,0,0,4,3,0,6,0},
{5,7,0,0,4,3,0,6,0},
{0,9,0,0,0,0,0,3,0},
{0,9,0,0,0,0,0,3,0},
{0,6,0,7,9,0,0,8,5},
{0,6,0,7,9,0,0,8,5},
{0,8,0,0,0,5,0,4,0},
{0,8,0,0,0,5,0,4,0},
{0,0,6,4,0,0,0,0,7},
{0,0,6,4,0,0,0,0,7},
{9,0,5,6,0,0,0,0,3},
{9,0,5,6,0,0,0,0,3},
};
};


short check_sudoku( short r, short c )
short check_sudoku( short r, short c )
{
short i;
short rr, cc;

for (i = 0; i < 9; i++)
{
{
short i;
if (i != c && sudoku[r][i] == sudoku[r][c]) return 0;
short rr, cc;
if (i != r && sudoku[i][c] == sudoku[r][c]) return 0;
rr = r/3 * 3 + i/3;
cc = c/3 * 3 + i%3;
for (i = 0; i < 9; i++)
if ((rr != r || cc != c) && sudoku[rr][cc] == sudoku[r][c]) return 0;
}
return -1;
}


short solve_sudoku( short i )
{
short r, c;

if (i < 0) return 0;
else if (i >= 81) return -1;

r = i / 9;
c = i % 9;

if (sudoku[r][c])
return check_sudoku(r, c) && solve_sudoku(i + 1);
else
for (sudoku[r][c] = 9; sudoku[r][c] > 0; sudoku[r][c]--)
{
{
if ( solve_sudoku(i) ) return -1;
if (i != c && sudoku[r][i] == sudoku[r][c]) return 0;
if (i != r && sudoku[i][c] == sudoku[r][c]) return 0;
rr = r/3 * 3 + i/3;
cc = c/3 * 3 + i%3;
if ((rr != r || cc != c) && sudoku[rr][cc] == sudoku[r][c]) return 0;
}
}
return 0;
return -1;
}
}


short solve_sudoku( short i )
CFMutableStringRef print_sudoku()
{
{
short i, j;
short r, c;
CFMutableStringRef mutStr;
if (i < 0) return 0;
mutStr = CFStringCreateMutable( kCFAllocatorDefault, 0 );
else if (i >= 81) return -1;

for (i = 0; i < 9; i++)
{
r = i / 9;
for (j = 0; j < 9; j++)
c = i % 9;
{
if (sudoku[r][c])
CFStringAppendFormat( mutStr, NULL, (CFStringRef)@" %d", sudoku[i][j] );
return check_sudoku(r, c) && solve_sudoku(i + 1);
}
else
CFStringAppendFormat( mutStr, NULL, (CFStringRef)@"\r" );
for (sudoku[r][c] = 9; sudoku[r][c] > 0; sudoku[r][c]--)
}
{
return( mutStr );
if ( solve_sudoku(i) ) return -1;
}
}
return 0;
}
CFMutableStringRef print_sudoku()
{
short i, j;
CFMutableStringRef mutStr;
mutStr = CFStringCreateMutable( kCFAllocatorDefault, 0 );
for (i = 0; i < 9; i++)
{
for (j = 0; j < 9; j++)
{
CFStringAppendFormat( mutStr, NULL, (CFStringRef)@" %d", sudoku[i][j] );
}
CFStringAppendFormat( mutStr, NULL, (CFStringRef)@"\r" );
}
return( mutStr );
}
EndC
EndC


Line 5,244: Line 5,243:
toolbox fn print_sudoku() = CFMutableStringRef
toolbox fn print_sudoku() = CFMutableStringRef


dim as short solution
short solution
dim as CFMutableStringRef cfRef
CFMutableStringRef cfRef


gC = " "
gC = " "
Line 5,256: Line 5,255:
print : print "Sudoku solved:" : print
print : print "Sudoku solved:" : print
if ( solution )
if ( solution )
gC = " "
gC = " "
cfRef = fn print_sudoku()
cfRef = fn print_sudoku()
fn ContainerCreateWithCFString( cfRef, gC )
fn ContainerCreateWithCFString( cfRef, gC )
print gC
print gC
else
else
print "No solution found"
print "No solution found"
end if
end if