チェス盤カバレッジの問題 - 分割統治

最近少し退屈私はチェス盤のカバレッジの問題をノック。

A:アルゴリズム分析

正方形からなる請求項2 ^ K * 2 ^ Kでチェス盤市松カバレッジの問題は、特定のポイントに加えて、基板の一の実施形態の完全なカバレッジを達成するために、任意の特定のポイントを与え。

モデルに示します:


いくつかの時点特別な部分で、私たちは、再帰的な彼に行けばない特定の部分、我々は完全なカバレッジを知って、同じ再帰を指すように特別なポイントを前提とした場合に解決策は除算を使用し、征服することで、正方形のチェス盤は、4つの部分に分けました。

    サブボードの左上隅(特殊なボックスが存在する場合):子供が特殊ボードボックスであると仮定されるボックスの右下隅。

    (特殊なボックスがある場合)、サブボードの右上:サブボードの正方形の左下隅は、特殊なボックスであると仮定されます。

    サブ基板の左下隅(特殊なボックスがある場合):サブボードの正方形の右上隅には、特殊なボックスであると仮定されます。

    サブボードの右下隅(特殊なボックスがある場合):子供は特別なボードボックスであると仮定されるボックスの左上隅。

コードの実装:

#include <iostreamの>
名前空間STDを使用して、
int型マップ[10] [10];
INT = N-1; // 1つの開始を埋めるために
解くボイド(INT bをint型 、INT XL、INT XR、INTイル、INT年) {//パラメータは、xおよびy座標、境界XRのX軸XL、y軸はYRに境界イルである特別ポイントに渡される
IF(XL == == YR XR ||イル){
/;リターン/全アウト図表れた再帰
}
INT XM =(XR + XL)/ 2; //これはメジアン軸xの境界である
INT YM =(イル+年) / 2; 境界の// y軸の位置数(これらの2つのパラメータは、ボード上の特定の点の位置を決定するために使用される)

(> BのXM && <= YM)IF {//右上隅が黒ブロックである
マップ[YM] [XM] = N; // 右上隅黒ブロック、中間位置nを充填する左上隅は、このブロックが黒ブロック領域(特別ポイント)とみなし、黒ブロックパーティションの左上隅に属します。
地図[YM + 1] [XM ] = N; // 同じ理由で、これは、黒ブロックの左下隅であること、及び隔壁の左下隅の領域に属するであろう。
地図[YM + 1] [XM + 1] = N; // これは右下隅、理由前掲あります。
++ N-;
解決(A、B、XM + 1、XR、YL、YM。); //なお、第1及び第2のパラメータは、aとb、再帰的分割の右上の領域であること。
解決(XM + 1、YM + 1、XM + 1、XR、YM + 1年); // これは、領域分割の右下隅には再帰的であり、その第1及び第2のパラメータに注意してください。
(XM、YM、XL、解決 XM、イル、YM); // 上記のように左上隅、その理由はここにあります。
解決(XM、YM + 1、 XL、XM、YM + 1年)であり; // これは、左下隅、上記と同じ理由です。
}
(A <= B && XM> YM){//左下隅で暗いブロックIF
マップ[YM] [XM] N- =;
マップ[YM] [XM + 1] = N-;
マップ[YM + 1] [XM 。+ 1] = N-;
N - ++;
(A、B、XL、XM、YM + 1、YR)解き;
(XM、YM、XL、XM、YL、YM)を解く;
(XM +解決1、YM、XM +。 。1、XR、YL、YM)
+(解決1 XM、YM + 1、XM + 1、XR、YM + 1、YR)。。。。。

}
IF(> XM && B> YM){//右下角是黑块
地図[YM] [XM] = N。
地図[YM] [XM + 1] = N。
地図[YM + 1] [XM] = N。
N ++;
解決(A、B、XM + 1、XR、YM + 1年)。
(XM、YM、XL、XM、イル、YM)を解きます。
(XM + 1、YM、XM + 1、XR、イル、YM)を解きます。
解決(XM、YM + 1、XL、XM、YM + 1年)。
}
IF(<= XM && B <= YM){//左上角是黑块
マップ[YM + 1] [XM + 1] = N。
地図[YM] [XM + 1] = N。
地図[YM + 1] [XM] = N。
N ++;
(A、B、XL、XM、イル、YM)を解きます。
解決(XM + 1、YM + 1、XM + 1、XR、YM + 1年)。
(XM + 1、YM、XM + 1、XR、イル、YM)を解きます。
解決(XM、YM + 1、XL、XM、YM + 1年)。

}

}


メインINT(){
int型A、B、

CIN >> A >> B;
位置//が8 * 8市松ことが本明細書で意図される場合、特殊な点、解決(A、B、0 、7、0、7) (A、B)のように
するための(I = 0 int型、Iは<8; Iは++){
ため(INT J = 0; J <8; J ++)COUT <<マップ[I]は[J] << "\ T"。
<< ENDL COUT;
}

 

0を返します。
}

おすすめ

転載: www.cnblogs.com/lfh123123/p/11761846.html