【数独运算器】,关于数独的解题思路,已经改进。
c语言吧
全部回复
仅看楼主
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;
}
}
}
====================================================================
发现了一个重大问题,就是用 行、列、宫对比的算法,只能用来求简单的熟读,高级的数独就解不出来了,求大神,是不是还需要写入高级算法,比如:区块摒除法、矩形摒除法、唯余解法这类算法,才能解出那种已知数非常少的数独。
2015年01月03日 04点01分 1
level 13
代码不代表思路。。。。
2015年01月03日 04点01分 2
忘写了,我的思路是未知数用零替代,然后循环找到为零的数组位置,就调用校验函数来解,首先从行和列开始校验、最后再校验3x3的宫,如果有唯一数就填入,没有继续找下一个为零数,最后,校验一下9x9是不是都有数了,如果有输出,没有的话继续循环,但我发现用行列宫的校验方法只能解初级数独。
2015年01月03日 04点01分
回复 肖攀123 :是不是还得写入高级算法,才能解那种已知数特别少的高级数独。
2015年01月03日 04点01分
level 13
=。=乃得去查查数学上与之相关的"姿势"[滑稽]
--(10²-10²)/(100-100)=(10-10)(10+10)/(10-10)/10=2
2015年01月03日 04点01分 3
2+2=two 2
2015年01月03日 07点01分
回复 父母的手 :[滑稽]   --sudo rm -rf /
2015年01月03日 08点01分
回复 a327380135 :你可以试试sudo rm -rf /喽[勉强]
2015年01月03日 09点01分
回复 父母的手 :[阴险]系统保护~拒绝执行 --(10²-10²)/(100-100)=(10-10)(10+10)/(10-10)/10=2
2015年01月03日 11点01分
level 13
2015年01月03日 04点01分 4
没学过C++,看不太明白,不过这里面好像有很多高级算法。
2015年01月03日 05点01分
回复 肖攀123 :我喜欢自己琢磨,希望能写出一个能解所有数独的算法程序。
2015年01月03日 05点01分
回复 肖攀123 :这货就是Dancing Links...
2015年01月03日 10点01分
level 13
就算你把这些高级推理全用上了还是存在不能用这些去解的数独
2015年01月03日 05点01分 6
这些算法都是模拟人脑运算,为什么?
2015年01月03日 05点01分
level 13
Dancing Links
2015年01月03日 05点01分 8
还在研究舞蹈链怎么解数独,以及怎么写成算法。
2015年01月03日 05点01分
level 7
解数独好像可以等价成集合的全覆盖
2015年01月03日 10点01分 9
level 2
牛逼 感觉!我们马上考了,数组,指针,字符串感觉自己都看不懂。。。。。。。
2015年01月03日 10点01分 10
1