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 |
TLE的不行了,哪位大牛能帮忙看看代码啊# 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