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);
}
─────
「WONDER PUZZLE」という箱詰めパズルを解くプログラムです。
このパズルは、チップの置き方を変えると、縦と横の升目の数が変わります。
(by 心如)
コメント 0