洛谷P1228 地毯填補問題
阿新 • • 發佈:2017-09-10
通過 -m 國家 沒有 p12 有一個 輸出 png esp
P1228 地毯填補問題
題目描述
相傳在一個古老的阿拉伯國家裏,有一座宮殿。宮殿裏有個四四方方的格子迷宮,國王選擇駙馬的方法非常特殊,也非常簡單:公主就站在其中一個方格子上,只要誰能用地毯將除公主站立的地方外的所有地方蓋上,美麗漂亮聰慧的公主就是他的人了。公主這一個方格不能用地毯蓋住,毯子的形狀有所規定,只能有四種選擇(如圖4-l):
並且每一方格只能用一層地毯,迷宮的大小為(2k)^2的方形。當然,也不能讓公主無限制的在那兒等,對吧?由於你使用的是計算機,所以實現時間為1s。
輸入輸出格式
輸入格式:
輸入文件共2行。
第一行:k,即給定被填補迷宮的大小為2^k(0<k≤10);
第二行:x y,即給出公主所在方格的坐標(x為行坐標,y為列坐標),x和y之間有一個空格隔開。
輸出格式:
將迷宮填補完整的方案:每一補(行)為x y c (x,y為毯子拐角的行坐標和列坐標,c為使用毯子的形狀,具體見上面的圖1,毯子形狀分別用1、2、3、4表示,x、y、c之間用一個空格隔開)。
輸入輸出樣例
輸入樣例#1:3 3 3輸出樣例#1:
5 5 1 2 2 4 1 1 4 1 4 3 4 1 2 4 4 1 2 7 3 1 5 4 1 8 3 3 6 3 4 8 1 7 2 2 5 1 4 6 3 2 8 1 2 8 4 1 7 7 1 6 6 1 5 8 3 8 5 2 8 8 1
/* 分治思想:每一次都可以通過將棋盤切成四塊縮小規模,直到縮小到規模為1*1時,結束遞歸。 每次覆蓋都是將牌放在當前棋盤中間,分成四個部分,肯定只有三個部分包含一個三分之一牌(一個黑塊),於是每一部分都成了只有一個黑牌的子問題。 由於題目沒有描述輸出的次序,要註意順序默認為左上,右上,左下,右下。 */ #include<iostream> #include<cstdio> #include<cstring> using namespace std; #define maxn 1<<11 int X,Y,C,map[maxn][maxn];int check(int x1,int y1,int x2,int y2){ int x=(x1+x2)/2; int y=(y1+y2)/2; for(int i=x1;i<=x2;i++) for(int j=y1;j<=y2;j++) if(map[i][j]){ if(i<=x){ if(j<=y)return 1; else return 2; } else{ if(j<=y)return 3; return 4; } } } void dfs(int x1,int y1,int x2,int y2){ int x=(x1+x2)/2+1; int y=(y1+y2)/2+1; int ans=check(x1,y1,x2,y2); if(ans==1){ printf("%d %d %d\n",x,y,ans); map[x][y]=1; map[x][y-1]=1; map[x-1][y]=1; } if(ans==2){ printf("%d %d %d\n",x,y-1,ans); map[x][y-1]=1; map[x-1][y-1]=1; map[x][y]=1; } if(ans==3){ printf("%d %d %d\n",x-1,y,ans); map[x][y]=1; map[x-1][y]=1; map[x-1][y-1]=1; } if(ans==4){ printf("%d %d %d\n",x-1,y-1,ans); map[x-1][y]=1; map[x-1][y-1]=1; map[x][y-1]=1; } if(x2-x1>=2){ dfs(x1,y1,x-1,y-1); dfs(x1,y,x-1,y2); dfs(x,y1,x2,y-1); dfs(x,y,x2,y2); } } int main(){ scanf("%d%d%d",&C,&X,&Y); map[X][Y]=1; dfs(1,1,1<<C,1<<C); }
洛谷P1228 地毯填補問題