nbsp; }
}
}
}
int fill(int Lad[][N], int position[][N], int hold[][N], int i, bool TF)
{
int k, j;
if (TF==true)
k=0; //从头开始填充i,行号置1
else
k=N-1; //在当前数字i回溯,行号置尾行号
while (1) //对i的回溯试探开始
{
if (k==0) //回溯至或开始填充第一行
{
for (j=position[k][i-1]+1; j<=N; j++) //寻找第一行填充位置
{
if (hold[k][j-1]==0)
break;
}
if (j>N) //第一行没有填充位置,填充失败,作必要的清理,返回0
{
Lad[k][position[k][i-1]-1]=0;
hold[k][position[k][i-1]-1]=0;
position[k][i-1]=0;
return 0;
}
if (position[k][i-1]!=0) //第一行已填充i
{
Lad[k][position[k][i-1]-1]=0;
hold[k][position[k][i-1]-1]=0; //必要的清理
}
position[k][i-1]=j; Lad[k][position[k][i-1]-1]=i; hold[k][position[k][i-1]-1]=1; //填充i
k++; continue; //试探下一行
}
else
{
if (find(i, position, hold, k)==0) //在k+1行找不到i的填充位置
{
if (position[k][i-1]!=0) //第k+1行已填充i
{
Lad[k][position[k][i-1]-1]=0;
hold[k][position[k][i-1]-1]=0; //必要的清理
position[k][i-1]=0;
}
k--; //回溯至上一行
continue;
}
else
{
if (position[k][i-1]!=0) //第k+1行已填充i
{
Lad[k][position[k][i-1]-1]=0;
hold[k][position[k][i-1]-1]=0; //必要的清理
}
position[k][i-1]=find(i, posi