1. 程式人生 > >鋪放矩形塊

鋪放矩形塊

ie8 輸入 ots jns sizeof rdf r+ idm jcu

問題描述   給定4個矩形塊,找出一個最小的封閉矩形將這4個矩形塊放入,但不得相互重疊。所謂最小矩形指該矩形面積最小。
  所有4個矩形塊的邊都與封閉矩形的邊相平行,圖1示出了鋪放4個矩形塊的6種方案。這6種方案僅只是可能的基本鋪放方案。因為其它方案能由基本方案通過旋轉和鏡像反射得到。
  可能存在滿足條件且有著同樣面積的各種不同的封閉矩形,你應該輸出所有這些封閉矩形的邊長。
技術分享圖片 輸入格式   共有4行。每一行用兩個正整數來表示一個給定的矩形塊的兩個邊長。矩形塊的每條邊的邊長範圍最小是1,最大是50。 輸出格式   總行數為解的總數加1。第一行是一個整數,代表封閉矩形的最小面積(子任務A)。接下來的每一行都表示一個解,由數P和數Q來表示,並且P≤Q(子任務B)。這些行必須根據P的大小按升序排列,P小的行在前,大的在後。且所有行都應是不同的。

解題算法

【模擬】

解題歷程:

初看無思路

情況極多如亂麻

覺得用函數實現可能比較快

代碼:

if(cnt==4)
{
if(x*y<sum)
{
memset(vis,0,sizeof(vis));
sum=x*y;
ans[ans[0]=1]=min(x,y);
vis[min(x,y)]=1;
}
else if(x*y==sum&&!vis[min(x,y)])
{
ans[++ans[0]]=min(x,y);
vis[min(x,y)]=1;
}
}
else
F(i,0,3)
if(!vit[i])
{
vit[i]=1;
//1
int xx=x+ex[i];
int yy=max(y,ey[i]);
dfs(xx,yy,cnt+1);
//2
xx=x+ey[i];
yy=max(y,ex[i]);
dfs(xx,yy,cnt+1);
//3
xx=max(x,ex[i]);
yy=y+ey[i];
dfs(xx,yy,cnt+1);
//4
xx=max(x,ey[i]);
yy=y+ex[i];
dfs(xx,yy,cnt+1);
vit[i]=0;
}

以上、

WA61

預料了...因為可以嵌進去的情況未考慮

所以分數很可觀

然後無思路

瞎搞

代碼:

num[0]=1;
F(i,1,6)
{
if(i<3)num[1]=2;
else if(i<5)num[1]=3;
else num[1]=4;
if(i==1||i==6)num[2]=3;
else if(i==2||i==4)num[2]=4;
else num[2]=2;
if(i==1||i==3)num[3]=4;
else if(i==2||i==5)num[3]=3;
else num[3]=2;
if(ex[num[0]]<=ey[num[1]]&&ex[num[1]]<=ey[num[2]]&&ey[num[3]]+ex[num[0]]<=ey[num[1]]+ex[num[2]])
{
int x=ex[num[2]]+ey[num[1]];
int y=max(ex[num[1]]+ey[num[0]],ey[num[2]]+ex[num[3]]);
if(x*y<sum)
{
memset(vis,0,sizeof(vis));
sum=x*y;
ans[ans[0]=1]=min(x,y);
vis[min(x,y)]=1;
}
else if(x*y==sum&&!vis[min(x,y)])
{
ans[++ans[0]]=min(x,y);
vis[min(x,y)]=1;
}
}
}

以上、

WA53

很明顯是錯的...水分也沒水到

所以目前無思路

以上

2018.2.14

鋪放矩形塊