3、链表操作
链表操作是最关键的部分了,其中的原理在前面连载2里面详细说明。这里直接贴代码出来。
while(tmp!=NULL){
//printf("itmp=%d\n",itmp);
sdktmp[tmp->x][tmp->y]=tmp->ixy;
blchk=chk(1,tmp->x,tmp->y,sdktmp);
if(!blchk){
if(tmp->next!=NULL){
tmp->blok =true;
tmp->next->pre=tmp;
tmp=tmp->next;
}else{
printf("经过%d次计算后,此数独得以解出\n",itmp);
printf("----最终结果----\n");
prtsdk(sdktmp);
break;
}
}else{
if(tmp->right!=NULL){
tmp->right->pre=tmp->pre;
if(tmp->next!=NULL){//最后一个单元格了
tmp->right->next=tmp->next;
tmp->next->blok=false;
}
tmp->blok=false;
tmp->pre->next=tmp->right;
tmp=tmp->right;
}else{//本行最后一个了
do{
tmp->blok=false;
tmp->pre->next=tmp->left->left->left->left->left->left->left->left;
tmp->left->left->left->left->left->left->left->left->blok=false;
tmp=tmp->pre;//之前的Do循环只加了这一句,导致无法出正确结果,要加上上面那些才行的。
if(tmp==head){
printf("本程序无法解决此数独,请确认是否出错\n");
prtsdk(sdktmp);
}
}while(tmp->right==NULL);//往前追溯的关键(以前编的时候,也有类似这句的,但忘了具体技巧)
//以上不影响最后一个单元格
//以下五步同上
tmp->right->pre=tmp->pre;
if(tmp->next!=NULL){//如果是最后一个单元格了,就没有next指针了
tmp->right->next=tmp->next;
tmp->next->blok=false;
}
tmp->blok=false;
tmp->pre->next=tmp->right;
tmp=tmp->right;
tmp->blok=false;
//重新赋值数独
for(int iii=0;iii<9;iii++) {
for(int jjj=0;jjj<9;jjj++){
sdktmp[iii][jjj]=sdk[iii][jjj];
}
}
//按指针填充表格
int itmpre=0;
tmpre=head->next;
do{
itmpre++;
if(tmpre->blok==true){
sdktmp[tmpre->x][tmpre->y]=tmpre->ixy;
tmpre=tmpre->next;
}else{
break;
}
}while(tmpre!=NULL);
}
}
itmp++;
}