您的位置:首页 > 其它

tyvj-1080 链表优化搜索

2012-03-02 20:01 246 查看
链表优化搜索

/*
* 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 40

int 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;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  优化 search