P1228 地毯填补问题(Java语言实现)
生活随笔
收集整理的這篇文章主要介紹了
P1228 地毯填补问题(Java语言实现)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
輸入輸出樣例見原題鏈接:地毯填補問題 - 洛谷
這道題屬于分治算法經典問題棋盤覆蓋問題的衍生題。為了更好的講解解題思路,在這里我將舉一個例子,通過例子來說明,如下圖,黑色方塊為公主位置,其他顏色則為毛毯。
? ? ? ?
? ? ? ? 1,將大方塊分成四小塊,找到被公主覆蓋的位置在哪個小塊 。
????????2,在該小塊頂角鋪上填補此形狀的毛毯,使公主不在的三個小方塊各被覆蓋一個位置。
? ? ? ? 3,進入公主所在的方塊,重復上述操作。直到被填滿。
? ? ? ? 4,由于公主不在的方塊未被處理,且因為公主不在的三個方塊被覆蓋了一個位置,所以可以把毛毯覆蓋的位置看做是公主所在的位置,重復上述操作,直到被填滿。
??????
動態圖演示
靜態原圖來源:
棋盤覆蓋問題-分治法_死啦死啦滴的博客-CSDN博客_棋盤覆蓋
接下來是Java代碼,注意其中的細節
import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner sc=new Scanner(System.in);int k,x,y;k=sc.nextInt();x=sc.nextInt();y=sc.nextInt();fill(x,y,1,1,1<<k);//位運算,等同于2的k次方sc.close();}static void fill(int x,int y,int dx,int dy,int len) {if(len==1) {return;}len>>=1;//等同于len÷=2//公主在左上if(x-dx<len&&y-dy<len) {System.out.println((dx+len)+" "+(dy+len)+" "+1);fill(x,y,dx,dy,len);//公主所在區域繼續分塊fill(dx+len-1,dy+len,dx,dy+len,len);//右上進行分塊fill(dx+len,dy+len-1,dx+len,dy,len);//左下進行分塊fill(dx+len,dy+len,dx+len,dy+len,len);//右下進行分塊}//公主在右上else if(x-dx<len&&y-dy>=len) {System.out.println((dx+len)+" "+(dy+len-1)+" "+2);fill(x,y,dx,dy+len,len);//公主所在區域繼續分塊fill(dx+len-1,dy+len-1,dx,dy,len);//左上進行分塊fill(dx+len,dy+len-1,dx+len,dy,len);//左下進行分塊fill(dx+len,dy+len,dx+len,dy+len,len);//右下進行分塊}//公主在左下else if(x-dx>=len&&y-dy<len) {System.out.println((dx+len-1)+" "+(dy+len)+" "+3);fill(x,y,dx+len,dy,len);//公主所在區域繼續分塊fill(dx+len-1,dy+len-1,dx,dy,len);//左上進行分塊fill(dx+len-1,dy+len,dx,dy+len,len);//右上進行分塊fill(dx+len,dy+len,dx+len,dy+len,len);//右下進行分塊}//公主在右下else if(x-dx>=len&&y-dy>=len) {System.out.println((dx+len-1)+" "+(dy+len-1)+" "+4); fill(x,y,dx+len,dy+len,len);//公主所在區域繼續分塊fill(dx+len-1,dy+len-1,dx,dy,len);//左上進行分塊fill(dx+len-1,dy+len,dx,dy+len,len);//右上進行分塊fill(dx+len,dy+len-1,dx+len,dy,len);//左下進行分塊}}}總結
以上是生活随笔為你收集整理的P1228 地毯填补问题(Java语言实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新媒体运营教程:如何用直播进行裂变+转化
- 下一篇: 10019---访问远程Redis服务。