C、1135 1158 1231 1598バイト
さて、それは定められた期限を過ぎていますが、まだ答えがないので、Cに1つ(少し長い)があります。
戻り値:
- 失敗時には0(ゼロ)(適合しない)
- 成功時の完全なフィッティングマトリックス
更新:
元のコードは、許可された10秒よりもはるかに長い時間を要して、一部のマトリックスでスタックする可能性があります。現在の改訂では、すべての行列が1秒未満で完了する必要があります。これは、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);}
UnGolfed:
#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が与えられた場所での長方形のためのスペースがあるかどうかを確認するためのEST。 L
fil lは長方形を出力バッファーに入れるか、または上書きすることによって長方形を削除します。O
そしてQ
、それぞれ、左と上壁を構築し、F
fは、反復検索によって長方形の残りを悪。
基本的な検索は繰り返し実行されますが、マスター長方形の幅と高さの許容される組み合わせを構築し、次に不可能な構成を削除することにより、可能な検索ベクトルの大部分を削除します。中央を埋める前に下と右の壁を決定することにより、より大きな長方形で追加の速度を得ることができますが、25個の内部長方形に制限する場合、まともな速度には必要ありません。