tyvj-1080 链表优化搜索

来源:互联网 发布:百度阅读 知乎 编辑:程序博客网 时间:2024/06/16 21:17

链表优化搜索

/* * tyvj-1080 * mike-w * 2012-2-3 * ================ * use something like dlx * it's double link list... */#include<stdio.h>#include<stdlib.h>#include<string.h>#define max_size 40int size,total;int row[max_size],col[max_size],ld[2*max_size],rd[2*max_size];int pre[max_size],nxt[max_size];int init(void){int i;for(i=1;i<=size;i++)pre[i]=i-1,nxt[i]=i+1;pre[size+1]=size;nxt[0]=1;return 0;}int disp(void){int i;for(i=1;i<size;i++)printf("%d ",row[i]);printf("%d\n",row[size]);return 0;}int search(int line){if(line==size+1){if(total<3)disp();total++;return 0;}int i;for(i=nxt[0];i<=size;i=nxt[i]){if(!ld[i+line] && !rd[i-line+max_size]){ld[i+line]=1;rd[i-line+max_size]=1;row[line]=i;/* unload a node */nxt[pre[i]]=nxt[i];pre[nxt[i]]=pre[i];search(line+1);ld[i+line]=0;rd[i-line+max_size]=0;/* relaod the node */nxt[pre[i]]=i;pre[nxt[i]]=i;}}return 0;}int main(void){scanf("%d",&size);init();search(1);printf("%d\n",total);return 0;}