回溯算法例题 c语言,回溯法解数独题

近段时间用到回溯算法的地方比较多,对算法的理解也有深入。今天偶然发现一张照片,是高中时未做完的一道数独题。当时用的是“候选余数法”,之后由于太麻烦,就没有做完。不过当时截图保存了,今天突然看到。那时候刚学完C语言,对汉诺塔递归都不是太理解,所以就一直拖到现在。

f573940900f8bc13847c7c5abcf3a1e0.png

用C++做的,代码如下#include

usingnamespace std;

intsudoku[9][9]={0};

//判断填在空白位置的数字在行、列上是否符合要求

boolJudge1(int x, int y, int n)

{

int i;

for(i=0;i<9;i++)

{

//判断 列

if((sudoku[i][y]==n)&& (i!=x))

returnfalse;

//判断 行

if((sudoku[x][i]==n)&& (i!=y))

returnfalse;

}

return true;

}

//判断填在空白位置的数字在九宫格之内是否符合要求

boolJudge2(int x, int y, int n)

{

int xx,yy,i,j;

xx=x/3;

yy=y/3;

for(i=xx*3;i

for(j=yy*3;j

if(sudoku[i][j]==n)

if(i==x&& j==y)

continue;

else

returnfalse;

return true;

}

//填充空白数组

boolFill(int m)

{

int n,x,y;

x=m/9;

y=m%9;

if (m>=81)

return true;

if (sudoku[x][y]==0)

{

for(n=1;n<=9;n++)

{

sudoku[x][y]=n;

if(Judge1(x,y,n)&&Judge2(x,y,n))

if(Fill(m+1))

returntrue;

sudoku[x][y]=0;

}

}

else

return Fill(m+1);

return false;

}

intmain()

{

//输入初始数独

int i,j,k;

cout <

for(i=0;i<9;i++)

for(j=0;j<9;j++)

cin>>sudoku[i][j];

/*for(i=0;i<9;i++)

{

for(j=0;j<9;j++)

cout<

cout <

}*/

if(Fill(0))//填充数独的空白位置完毕

{

for(i=0;i<9;i++)

{

for(j=0;j<9;j++)

{

cout<

if(!((j+1)%3))

cout<

}

cout<

if(!((i+1)%3))

{

for(k=0;k<12;k++)

cout<

cout<

}

}

}

else

cout <

return 0;

}

运行之后的截图

60f64f7239186484ee03aab20a384d97.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值