| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
回溯+剪枝,还是挂..汗In Reply To:TLE的不行了,哪位大牛能帮忙看看代码啊 Posted by:yzhw at 2009-03-26 18:15:27 > # include <stdio.h>
> # include <stdlib.h>
> # include <stdbool.h>
> bool map1[51][51],map2[51][51];
> int *list,num,n;
> bool canput_sub(int r,int c,int len,int id1,int id2)
> {
> int i,j;
> if(id2==1)
> {
>
> i=r;
> for(j=c+i-r;j<=c+len-1;j++)
> if(map1[i][j]) return 0;
>
>
> }
> else
> {
>
> for(i=r+len-1;i>=r;i--)
> for(j=c;j<=c+i-r;j++)
> if(map2[i][j]) return 0;
>
> }
> return 1;
> }
> void deput_sub(int r,int c,int len,int id1,int id2)
> {
> int i,j;
> if(id2==1)
> {
> if(id1==1)
> {
> for(i=r;i<=r+len-1;i++)
> {
> for(j=c+i-r;j<=c+len-1;j++)
> map1[i][j]=0;
> }
> }
> else
> {
> for(i=r;i<=r+len-1;i++)
> {
> for(j=c+i-r;j<=c+len-1;j++)
> map2[i][j]=0;
> }
> }
> }
> else
> {
> if(id1==1)
> {
> for(i=r;i<=r+len-1;i++)
> for(j=c;j<=c+i-r;j++)
> map1[i][j]=0;
> }
> else
> {
> for(i=r;i<=r+len-1;i++)
> for(j=c;j<=c+i-r;j++)
> map2[i][j]=0;
> }
> }
> }
> void put_sub(int r,int c,int len,int id1,int id2)
> {
> int i,j;
> if(id2==1)
> {
> if(id1==1)
> {
> for(i=r;i<=r+len-1;i++)
> {
> for(j=c+i-r;j<=c+len-1;j++)
> map1[i][j]=1;
> }
> }
> else
> {
> for(i=r;i<=r+len-1;i++)
> {
> for(j=c+i-r;j<=c+len-1;j++)
> map2[i][j]=1;
> }
> }
> }
> else
> {
> if(id1==1)
> {
> for(i=r;i<=r+len-1;i++)
> for(j=c;j<=c+i-r;j++)
> map1[i][j]=1;
> }
> else
> {
> for(i=r;i<=r+len-1;i++)
> for(j=c;j<=c+i-r;j++)
> map2[i][j]=1;
> }
> }
> }
> bool canput(int r,int c,int id,int len)
> {
> if(c+len-1>2*n||r+len-1>2*n) return 0;
> if(id==1)
> {
> return canput_sub(r,c,len,1,1);
> }
> else
> {
> return canput_sub(r,c,len,2,2);
> }
> }
> void put(int r,int c,int id,int len)
> {
> if(id==1)
> {
> put_sub(r,c,len,1,1);
> put_sub(r,c+1,len-1,2,1);
> }
> else
> {
> put_sub(r,c,len,2,2);
> put_sub(r+1,c,len-1,1,2);
> }
> }
> void deput(int r,int c,int id,int len)
> {
> if(id==1)
> {
> deput_sub(r,c,len,1,1);
> deput_sub(r,c+1,len-1,2,1);
> }
> else
> {
> deput_sub(r,c,len,2,2);
> deput_sub(r+1,c,len-1,1,2);
> }
> }
> bool dec(int r,int c,int id)
> {
> if(r>2*n) return 1;
> else if(c>2*n&&id==1) return dec(r,1,2);
> else if(c>2*n&&id==2) return dec(r+1,1,1);
> else if(id==1&&map1[r][c]==1)
> {
> int i;
> for(i=c;i<=2*n;i++)
> if(!map1[r][i]) break;
> return dec(r,i,id);
> }
> else if(id==2&&map2[r][c]==1)
> {
> int i;
> for(i=c;i<=2*n;i++)
> if(!map2[r][i]) break;
> return dec(r,i,id);
> }
> else
> {
> int i;
> for(i=1;i<=num;i++)
> {
> if(canput(r,c,id,list[i]))
> {
> put(r,c,id,list[i]);
> if(dec(r,c+list[i],id))
> return 1;
> deput(r,c,id,list[i]);
> }
> else break;
> }
> return 0;
> }
> }
> int cmp(const void *a,const void *b)
> {
> return *(int *)a-*(int *)b;
> }
> int main()
> {
> int test,i;
> scanf("%d",&test);
> for(i=1;i<=test;i++)
> {
> int j,k,flag=0;
> scanf("%d %d",&n,&num);
> memset(map1,1,sizeof(map1));
> memset(map2,1,sizeof(map2));
> list=(int *)calloc(num+1,sizeof(int));
> for(j=1;j<=num;j++) scanf("%d",list+j);
> for(j=1;j<=num;j++)
> {
> if(n%list[j]==0)
> {
> flag=1;
> break;
> }
> if(list[j]>n)
> {
> num=j-1;
> break;
> }
> }
> if(flag)
> {
> printf("YES\n");
> free(list);
> continue;
> }
> qsort(list+1,num,sizeof(int),cmp);
> /*-------------set map----------------*/
> for(j=1;j<=n+1;j++)
> for(k=1;k<=j+n-1;k++)
> map1[j][k]=0;
> for(j=n+2;j<=2*n;j++)
> for(k=j-n;k<=2*n;k++)
> map1[j][k]=0;
> for(j=1;j<=n;j++)
> for(k=1;k<=j+n;k++)
> map2[j][k]=0;
> for(j=n+1;j<=2*n;j++)
> for(k=j-n+1;k<=2*n;k++)
> map2[j][k]=0;
> /*----------end of build map--------*/
> if(dec(1,1,1)) printf("YES\n");
> else printf("NO\n");
> free(list);
>
> }
>
> return 0;
> }
>
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator