SSブログ

wpm2.cpp [C++]

// WONDER PUZZLE 02 MAIN_2
//
// 2012.03.21 ───── coded by 心如

#include <iostream>
#include <string>
#include <ctime>
using namespace std;

const Bw = 16;  // Board-Width
const Bh = 9;   // Board-Height
const Sw = 7;   // Board-Space-Width
const Sh = 7;   // Board-Space-Height
const Sp = 17;  // Start-Point
const Mp = 119; // Maximum-Point
const Fv = 12;  // frame-value

// Initialize piece data
struct chip {
    int id, s1, s2, s3, s4;
};
struct chip chip_data[] = {
    { 1, 16, 17, 32,  0},
    { 1, 16, 15, 32,  0},
   
    { 2,  1,  2, 17,  0},
    { 2, 16, 15, 17,  0},
   
    { 3,  1,  2, 16, 18},
    { 3, 16, 17, 18,  2},
   
    { 4, 16, 15, 14,  0},
    { 4, 16, 17, 18,  0},
    { 4,  1,  2, 18,  0},
    { 4,  1,  2, 16,  0},
   
    { 5, 16, 17, 33,  0},
    { 5, 16, 15, 31,  0},
   
    { 6, 16, 15, 14, 17},
    { 6, 16, 15, 17, 18},
    { 6,  1,  2,  3, 17},
    { 6,  1,  2,  3, 18},
   
    { 7,  1, 17, 18,  0},
    { 7,  1, 16, 15,  0},
   
    { 8, 16, 32, 33,  0},
    { 8, 16, 32, 31,  0},
    { 8,  1, 16, 32,  0},
    { 8,  1, 17, 33,  0},
   
    { 9,  1,  2,  3, 16},
    { 9,  1,  2,  3, 19},
    { 9, 16, 17, 18, 19},
    { 9, 16, 15, 14, 13},
   
    {10,  1, 17, 18, 19},
    {10,  1, 16, 15, 14},
    {10,  1,  2, 18, 19},
    {10,  1,  2, 16, 15},
   
    {11,  1,  2, 17, 18},
    {11,  1,  2, 16, 17},
    {11,  1, 16, 17, 18},
    {11,  1, 16, 17, 15}
};

class Puzzle{
    int cnt;
    int cpm;
    int board[Bw * Bh];
    int chip_use[Fv];
public:
    Puzzle();
    void disp();
    void play(int);
};

Puzzle::Puzzle(){
    int i, j;
   
    cpm = sizeof(chip_data) / sizeof(chip);
    cnt = 0;    // 解の数をクリア
    // ボードの初期化
    for( i = 0; i < Bw * Bh; i++){
        board[i] = Fv;
    }
    for( i =0; i < Sh; i++){
        for( j = 0; j < Sw; j++){
            board[Sp + i * Bw + j] = 0;
        }
    }
    // チップの使用フラグをクリア
    for( i = 0; i < Fv; i++){
        chip_use[i] = 0;
    }
}

// パズルの表示
void Puzzle::disp(){
    int i, j;
    string ppp[] = {
        "・",
        "あ", "い", "う", "え", "お",
        "か", "き", "く", "け", "こ",
        "さ", "┃"
    };
    printf(" %d 回目( %5.3f 秒)\n", cnt++, (float )clock() / CLOCKS_PER_SEC);
    cout << "┏━━━━━━━┓" << endl;
    for(i = 1; i < 8; i++){
        for(j = 0; j < 9; j++){
                cout << ppp[ board[i * Bw + j]];
        }
        cout << endl;
    }
    cout << "┗━━━━━━━┛" << endl;
}

// パズルの探索
void Puzzle::play( int sp){
    int idn, p1, p2, p3, p4;
    // 探索場所の確認
    if( board[sp + 1] != 0 && board[sp + Bw] != 0){
        return;
    }
    // チップ数だけ確認
    for(int i = 0; i < cpm; i++){
        // チップが使用中か確認
        if(chip_use[idn = chip_data[i].id] != 0){
            continue;
        }
        // チップが置けるか?
        if(board[p1 = sp + chip_data[i].s1] != 0) continue;
        if(board[p2 = sp + chip_data[i].s2] != 0) continue;
        if(board[p3 = sp + chip_data[i].s3] != 0) continue;
        if(board[p4 = sp + chip_data[i].s4] != 0) continue;
        // チップの配置
        board[sp] = idn;
        board[p1] = idn;
        board[p2] = idn;
        board[p3] = idn;
        board[p4] = idn;
        chip_use[idn] = 1;
        // 次の空きを探す
        int np = sp;
        while(np++ < Mp){
            if(board[np] == 0) break;
        }
        if(np <= Mp){
            play( np);  // 次のチップを探索
        }
        else{
            disp(); // 解を表示
        }
        // チップの除去
        board[sp] = 0;
        board[p1] = 0;
        board[p2] = 0;
        board[p3] = 0;
        board[p4] = 0;
        chip_use[idn] = 0;
    }
}

int main(){
    Puzzle pzl;
    pzl.disp();
    pzl.play(Sp);
}
─────
CPP wpm2.jpg


 「WONDER PUZZLE」という箱詰めパズルを解くプログラムです。

 このパズルは、チップの置き方を変えると、縦と横の升目の数が変わります。

(by 心如)


タグ:パズル
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Facebook コメント

トラックバック 0

hexomino.cpp素因数分解 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。