Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

dancing links~0ms,attach AC code~

Posted by yzhw at 2010-08-26 22:43:27 on Problem 2676
# include <iostream>
# include <cstring>
using namespace std;
# define N 250000
struct node
{
	int row,col;
	int l,r,d,u;
}buf[N];
int ccc=324;
int co=0,head=0,row,col,cn[1000];
inline int posr(int a)
{
	return 1+col+a;
}
inline int posc(int a)
{
	return 1+a;
}
inline int block(int r,int c)
{
	return r/3*3+c/3;
}
void init(int r,int c)
{
	int i;
	row=r;
	col=c;
	buf[0].u=row+col;
	buf[0].l=col;
	buf[0].row=buf[0].col=-1;
	buf[0].r=1;
	buf[0].d=col+1;
	for(i=2;i<=col;i++)
		buf[i].l=i-1;
	for(i=1;i<col;i++)
		buf[i].r=i+1;
	for(i=1;i<=col;i++)
		buf[i].u=buf[i].d=i,buf[i].row=-1,buf[i].col=i-1;
	buf[col].r=0;
	buf[col+1].u=0;
	for(i=col+2;i<=col+row;i++)
		buf[i].u=i-1;
	for(i=col+1;i<col+row;i++)
		buf[i].d=i+1;
	for(i=col+1;i<=col+row;i++)
		buf[i].l=buf[i].r=i,buf[i].row=i-col-1,buf[i].col=-1;
	buf[row+col].d=0;
	co=row+col+1;
	memset(cn,0,sizeof(cn));
}
void insert(int r,int c)
{
	buf[co].row=r;
	buf[co].col=c;
	buf[co].u=posc(c);
	buf[co].d=buf[posc(c)].d;
	buf[co].l=posr(r);
	buf[co].r=buf[posr(r)].r;
	buf[posc(c)].d=co;
	buf[buf[co].d].u=co;
	buf[posr(r)].r=co;
	buf[buf[co].r].l=co++;
	cn[c]++;
}
void remove(int c)
{
	int i,j;
	buf[buf[posc(c)].l].r=buf[posc(c)].r;
	buf[buf[posc(c)].r].l=buf[posc(c)].l;
	ccc--;
	for(i=buf[posc(c)].d;i!=posc(c);i=buf[i].d)
	{
		for(j=buf[i].r;j!=i;j=buf[j].r)
		{
			buf[buf[j].u].d=buf[j].d;
			buf[buf[j].d].u=buf[j].u;
			if(buf[j].col!=-1)
				cn[buf[j].col]--;
		}
	}
}
void resume(int c)
{
	int j,i;
	ccc++;
	for(i=buf[posc(c)].u;i!=posc(c);i=buf[i].u)
	{
		for(j=buf[i].l;j!=i;j=buf[j].l)
		{
			buf[buf[j].d].u=j;
			buf[buf[j].u].d=j;
			if(buf[j].col!=-1)
			    cn[buf[j].col]++;
		}
	}
	buf[buf[posc(c)].r].l=posc(c);
	buf[buf[posc(c)].l].r=posc(c);
}
int ans[100][2];
char str[100];
int dfs(int level)
{
	if(buf[head].r==head)
	{
		for(int i=0;i<level;i++)
		{
		   str[ans[i][1]]=ans[i][0]%9+'1';
		}
		for(int i=0;i<81;i++)
		{
			cout<<str[i];
			if(i%9==8)
				cout<<endl;
			
		}
		return 1;
	}
	else
	{
		int maxnum=0xfffffff,pos,i,j;
		for(i=buf[head].r;i!=head;i=buf[i].r)
			if(cn[buf[i].col]<maxnum)
				maxnum=cn[buf[i].col],pos=buf[i].col;

		remove(pos);
		for(i=buf[posc(pos)].d;i!=posc(pos);i=buf[i].d)
		{
			ans[level][0]=buf[i].row;
			if(pos<81) ans[level][1]=buf[i].col;
			for(j=buf[i].r;j!=i;j=buf[j].r)
				if(buf[j].col!=-1)
				{
				   remove(buf[j].col);
				   if(buf[j].col<81)
					   ans[level][1]=buf[j].col;
				}
		//	chk();
			if(dfs(level+1)) return 1;
			for(j=buf[i].l;j!=i;j=buf[j].l)
				if(buf[j].col!=-1)
					resume(buf[j].col);
		}
		resume(pos);
		return 0;
	}


}
int main()
{	 
	 int testcase;
	 cin>>testcase;
	 while(testcase--)
	 {
         char tmp[20];
		 str[0]='\0';
		 for(int i=0;i<9;i++)
		 {
			 cin>>tmp;
			 strcat(str,tmp);
		 }
		 init(729,324);
		 for(int i=0;i<9;i++)
		 {
			 for(int j=0;j<9;j++)
				 for(int k=0;k<9;k++)
				 {
					 insert(i*81+j*9+k,i*9+j);
					 insert(i*81+j*9+k,81+i*9+k);
					 insert(i*81+j*9+k,81+81+9*j+k);
					 insert(i*81+j*9+k,81+81+81+9*block(i,j)+k);
				 }
		 }
		 for(int i=0;i<9;i++)
			 for(int j=0;j<9;j++)
			   if(str[i*9+j]!='0')
			   {
				   remove(i*9+j);
				   int k;
				   for(k=buf[posc(i*9+j)].d;k!=posc(i*9+j)&&buf[k].row!=i*81+j*9+str[i*9+j]-'1';k=buf[k].d);
				   for(int l=buf[k].r;l!=k;l=buf[l].r)
						   if(buf[l].col!=-1)
							   remove(buf[l].col);					   
			   }
		dfs(0);
	 }
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator