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

好人啊

Posted by lisency at 2012-04-06 18:32:07 on Problem 2676
In Reply To:dancing links~0ms,attach AC code~ Posted by:yzhw at 2010-08-26 22:43:27
> # 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