鋪放矩形塊
所有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
鋪放矩形塊