C, 1135 1158 1231 1598 바이트
글쎄, 그것은 정해진 마감일이 지났지 만 아직 답변이없는 방법으로 보아 C에 하나 있습니다.
보고:
- 실패시 0 (제로) (적합하지 않음)
- 성공에 대한 완벽한 피팅 매트릭스
최신 정보:
원래 코드가 일부 행렬에 붙어서 허용되는 10 초보다 훨씬 오래 걸릴 수 있습니다. 현재 수정 버전은 1s 미만의 모든 행렬을 완성해야합니다. 이것은 1) 입력 사각형을 정렬하고 2) 피팅 할 때 반복되는 크기를 건너 뛰어 수행합니다.
골프 :
#define R r[i]
#define Z return
#define _(B,D,E) for(int B=E;B<D;B++)
struct{int x,y,u,p;}r[25],*S;int A,M,N,U,V,X,Y;char *P;T(x,y,w,h){_(I,x+w,x)_(J,y+h,y)if(I/U|J/V|P[J*U+I])Z 0;Z 1;}L(x,y,w,h,c){_(I,x+w,x)_(J,y+h,y)P[J*U+I]=c;}F(){int x=0,y;while(++x<A)if(!P[x])break;if(x/A){_(i,V,0)printf("%*.*s\n",U,U,P+i*U);exit(0);}y=x/U;x-=y*U;_(i,N,0)if(!R.u&T(x,y,R.x,R.y))R.u=1,L(x,y,R.x,R.y,'A'+i),F(),R.u=0,L(x,y,R.x,R.y,0);}O(i,y){if(!R.u){if(!T(0,y,R.x,R.y))Z;R.u=1;R.p=0;L(0,y,R.x,R.y,'A'+i);y+=R.y;}if(y-V||F())_(j,N,0)if(j-i&!r[j].u){O(j,y);while(r[j].x-r[j+1].x|r[j].y-r[j+1].y)j++;}R.u=0;L(R.p,(y-=R.y),R.x,R.y,0);}Q(i,x){if(!R.u){if(R.x>U-x)Z;R.u=1;R.p=x;L(x,0,R.x,R.y,'A'+i);x+=R.x;}if(x-U||O(i,1))_(j,N,0)if(j-i&!r[j].u)Q(j,x);L(x-=R.x,0,R.x,R.y,0);R.u=0;}C(int*a,int*b){Z*a-*b?*a-*b:a[1]-b[1];}main(){_(i,25,0)if(++N&scanf("%d%d\n",&R.x,&R.y)-2)break;_(i,N,0){A+=R.x*R.y;if(R.x>X)X=R.x;if(R.y>Y)Y=R.y;}_(i,A+1,1)if(!(A%i)){if(i<Y|A/i<X)continue;M++;S=realloc(S,M*16);S[M-1].y=i;S[M-1].x=A/i;}qsort(S,M,16,C);P=calloc(A+1,1);_(j,M,0){U=S[j].x;V=S[j].y;_(i,N,0)R.u=1,L(0,0,R.x,R.y,'A'+i),Q(i,R.x),R.u=0;}printf("0\n");exit(1);}
언 골프 드 :
#define R r[i]
#define Z return
#define _(B,D,E) for(int B=E;B<D;B++)
struct {
int x,y,u,p;
} r[25],*S;
int A,M,N,U,V,X,Y;
char *P;
test_space(x,y,w,h) {
_(I,x+w,x)
_(J,y+h,y)
if ( I >= U |
J >= V |
P[J*U+I]) Z 0;
Z 1;
}
place_rect(x,y,w,h,c){
_(I,x+w,x)
_(J,y+h,y)P[J*U+I] = c;
}
fill_rest() {
int x=0,y;
while(++x<A) if (!P[x])break;
if (x>=A) {
_(i,V,0) printf("%*.*s\n", U,U, P+i*U);
exit(0);
}
y = x / U; x -= y*U;
_(i,N,0)
if (!R.u & test_space(x, y, R.x, R.y))
R.u = 1,
place_rect(x, y, R.x, R.y, 'A'+i),
fill_rest(),
R.u = 0,
place_rect(x, y, R.x, R.y, 0);
}
fill_y(i,y) {
if (!R.u) {
if (!test_space(0, y, R.x, R.y)) Z;
R.u = 1;
R.p = 0;
place_rect(0, y, R.x, R.y, 'A'+i);
y += R.y;
}
if (y == V) fill_rest();
else _(j,N,0)
if (j!=i && !r[j].u){ fill_y(j, y);
while (r[j].x^r[j+1].x||r[j].y^r[j+1].y)j++;
}
R.u = 0;
place_rect(R.p, (y -= R.y), R.x, R.y, 0);
}
fill_x(i,x) {
if (!R.u) {
if (R.x > U - x) Z;
R.u = 1;
R.p = x;
place_rect(x, 0, R.x, R.y, 'A'+i);
x += R.x;
}
if (x == U) fill_y(i, 1);
else
_(j,N,0)
if (j!=i && !r[j].u) fill_x(j, x);
place_rect((x -= R.x), 0, R.x, R.y, 0);
R.u = 0;
}
C(int*a,int*b) {
Z *a^*b?*a-*b:a[1]-b[1];
}
main() {
_(i,25,0)
if (++N&&scanf("%d %d\n", &R.x, &R.y)!=2) break;
_(i,N,0){
A+=R.x*R.y;
if(R.x>X)X=R.x;
if(R.y>Y)Y=R.y;
}
_(i,A+1,1)
if (!(A%i)) {
if (i < Y | A/i < X) continue;
M++;
S = realloc(S,M*16);
S[M-1].y=i;
S[M-1].x=A/i;
}
qsort(S, M, 16,C);
P = calloc(A + 1,1);
_(j,M,0){
U = S[j].x; V = S[j].y;
_(i,N,0)
R.u = 1,
place_rect(0, 0, R.x, R.y, 'A'+i),
fill_x(i, R.x),
R.u = 0;
}
printf("0\n");
exit(1);
}
설명 :
우리는 6 개 기능을 가지고 : main
, O
, Q
, F
, L
와 T
. T
t는 주어진 자리에서 사각형 공간이 있는지 ESTS. L
FIL에서 L은 출력 버퍼에 구형 S 또는 교대로 덮어 쓰기함으로써 하나를 제거한다. O
그리고 Q
각각 왼쪽 상단 벽을 구축하고 F
f를 반복 검색하여 사각형의 나머지 부분을 악.
기본 검색은 반복적이지만 먼저 마스터 사각형에 허용되는 너비와 높이의 조합을 구성한 다음 불가능한 구성을 제거하여 가능한 많은 검색 벡터를 제거합니다. 중심을 채우기 전에 바닥과 오른쪽 벽을 결정하면 큰 직사각형에서 추가 속도를 얻을 수 있지만 내부 사각형을 25 개로 제한 할 때 적절한 속도는 필요하지 않습니다.