level 5
肖攀123
楼主

源代码:=======================================================================
#include <stdio.h>
#include <windows.h>
char input(char sudoku[9][9])
{
int calcline,calccolumn;
for(calcline=0;calcline<9;calcline++)
{
if(calcline!=0&&calcline%3==0)
{
printf("一一一一一一一一一一一一一一一一一一一一一一\n");
printf(" 丨 丨\n");
}
for(calccolumn=0;calccolumn<9;calccolumn++)
{
if(calccolumn!=0&&calccolumn%3==0)
{
printf("丨 ");
}
sudoku[calcline][calccolumn]=getche();
printf(" ");
}
if(calcline!=8)
{
printf("\n 丨 丨\n");
}
}
}
char output(char sudoku[9][9])
{
int calcline,calccolumn;
printf("\n\n\n经过运算得出数独解:");
printf("\n\n\n");
for(calcline=0;calcline<9;calcline++)
{
if(calcline!=0&&calcline%3==0)
{
printf("一一一一一一一一一一一一一一一一一一一一一一\n");
printf(" 丨 丨\n");
}
for(calccolumn=0;calccolumn<9;calccolumn++)
{
if(calccolumn!=0&&calccolumn%3==0)
{
printf("丨 ");
}
printf("%c",sudoku[calcline][calccolumn]);
printf(" ");
}
if(calcline!=8)
{
printf("\n 丨 丨\n");
}
}
printf("\n\n");
getche();
}
int UI()
{
HANDLE hOut=GetStdHandle
(STD_OUTPUT_HANDLE);
COORD bufferSize={0};
system("mode con cols=80 lines=60");
printf("\n\t\t\t++++++++++++++++++++++++++++++");
printf("\n\t\t\t+ +");
printf("\n\t\t\t+ 数独运算器 +");
printf("\n\t\t\t+ +");
printf("\n\t\t\t++++++++++++++++++++++++++++++");
printf("\n\n请输入数独已知数<未知数用0替代>");
printf("\n\n");
}
int calibration(int x,int y,char sudoku[9][9])
{
char array[9]={'1','2','3','4','5','6','7','8','9'},find;
int calcline,calccolumn,n1,n2,n3;
n1=(x/3)*3;
n2=(y/3)*3;
int calc=9;
for(calcline=0;calcline<9;calcline++)
{
for(calccolumn=0;calccolumn<9;calccolumn++)
{
if(sudoku[x][calcline]==array[calccolumn])
{
array[calccolumn]='x';
}
if(sudoku[calcline][y]==array[calccolumn])
{
array[calccolumn]='x';
}
}
}
for(calcline=n1;calcline<n1
+3
;calcline++)
{
for(calccolumn=n2;calccolumn<n2+3;calccolumn++)
{
for(n3=0;n3<9;n3++)
{
if(sudoku[calcline][calccolumn]==array[n3])
{
array[n3]='x';
}
}
}
}
for(calcline=0;calcline<9;calcline++)
{
if(array[calcline]=='x')
{
calc--;
}
else
{
find=array[calcline];
}
}
if(calc==1)
{
sudoku[x][y]=find;
return 1;
}
else
{
return 0;
}
}
int iszero(char sudoku[9][9])
{
int x,y,calc,receive;
calc=0;
for(x=0;x<9;x++)
{
for(y=0;y<9;y++)
{
if(sudoku[x][y]=='0')
{
receive=calibration(x,y,sudoku);
calc+=receive;
}
else
{
calc++;
}
}
}
return calc;
}
int main(void)
{
int calc;
char sudoku[9][9];
UI();
input(sudoku);
while(1)
{
calc=iszero(sudoku);
if(calc==81)
{
output(sudoku);
break;
}
}
}
====================================================================
发现了一个重大问题,就是用 行、列、宫对比的算法,只能用来求简单的熟读,高级的数独就解不出来了,求大神,是不是还需要写入高级算法,比如:区块摒除法、矩形摒除法、唯余解法这类算法,才能解出那种已知数非常少的数独。