1. 程式人生 > >洛谷P1228 地毯填補問題

洛谷P1228 地毯填補問題

通過 -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 地毯填補問題