P1312マヤゲーム[深い検索] [シミュレーション]

タイトル説明

マヤのパズルは、人気ゲームの最新のものです。ボードゲームインタフェースボックスの上に重ね一部と、ボックスが積み重ね中断することができない、7行5列であり、それは一番下の行では、ボックス内に配置され、又は他の正方形の上に配置されなければなりません。ゲームのクリアランスは、ブロックルールを排除する、所定のステップ数内のすべてのブロックを排除する意味は以下の通りである:
1、及び各ステップ移動のみ(すなわち、左または右)横方向にドラッグブロックグリッドであってもよい。場合ドラッグ(以下、目標位置と呼ぶ)、ドラッグ位置に到着すると、ブロックである場合に、可動ブロックは、これら2つのブロックが位置を交換する時期(入力および出力サンプル6〜7の説明を参照)、目標位置する場合次いで、ブロックは、元の垂直列からドラッグされないブロックは、目標位置から(。。空きになるまで、1及び図2を参照以下)抜き出さず、落下され、

図2に示すように、いずれかの時点で、または横であれば(図1~図3参照)は、3つの連続した又は垂直列の同じ色の三つ以上のブロックは、それらが直ちに除去されるがあります。

注意:

両方のブロックを満たす条件の複数のセットを排除する場合a)に示すように、ブロックのいくつかのグループはまた、除去される(例えば、図以下4、三色三色1ブロック2ブロックはまた、最終的な色を残す、除去されています2)ブロックです。

そこ条件ブロックを満たす行と列の両方の排除であり、すべての条件を満たすように、行を共有する状況を排除しながら、図中、以下の行と列に示すように、例えば、(ボックスを排除するであろう。5ときb)に示すように、5つのブロックも除去されます)。
図3は、箱の除去後、ドロップの位置の排除のボックスには、ドロップ後に新しいボックスが排除可能性があります。注意:秋を除去する過程でブロックがあります。
上記図1〜3は、ボード上の正方形に移動した後の基板の変化を示しています。ボードの左下隅の座標をブロックするようにした後(0、0)、位置(3、3)左へのブロック移動すると、図1から図2に示すゲームインタフェース状態は、この場合、垂直列にあります図4は、連続する3色ブロック4の三つの連続ブロックの後に色を除去する、削除条件を満たしているブロックであり、上側ボックス3の色は、図に示す状態を形成するためにドロップされます。

入力形式

6行の合計。
最初の正の整数n、クリアランスゲームを必要なステップ数を行っています。
以下の5行は、ゲームのインターフェイス7×5を説明します。それぞれ、各垂直列の下から上へ、0にスペースで区切られた各二つの整数、各ラインの一端との間の整数を、線の色のブロック番号色の(10種類以上を表し、番号順次1から出発して、同じ番号)が同じ色を示しています。
何の初期の碁盤目がないことを確認するために、入力データを排除することができます。
出力形式
溶液、出力n行、各ラインは三つの整数のX、Y、Gを含んでいるがある場合は、移動、それぞれ2つの整数の間の空間によって分離さを表す(x、y)は(x、 y)は移動するボックスの座標を表し、Gは、右の動きが1を表し、移動の方向を示し-1手段は左。注:複数の溶液は、xの最初のキーワードに応じて、yは第2のキーワード、上-1辞書溶液の最小セットが与えられた優先度である場合。ゲーム画面座標の左下隅(0,0)(0,0)。
整数-1-1を含むいかなる溶液、出力1行が存在しない場合。

練習

検索+シミュレーション。書き込み機能の各種操作は、コードを簡略化します。
配列の説明:
M [I] [J]図格納さ---
CM [K] [I] [ J] --- 場合、CNT = K検索ビューを保存することができ、便利にバック
時代を削除[I] [J ]:時代の場合[I] [J] == 1、 次にM [i] [j]は解消することができます。
機能:
削除:ボックスの排除をなくすことができる
ためのドロップダウンボックス:更新
移動:スワップ二つのブロックを、そしてすべての変更は、次に何が起こる完了する。
検索は:
好ましくは1-1の辞書最小比を必要とします。そして、我々は右のボックスの左「「左、右のボックス」と同等のものを考えるとき。」だから我々は左に検討する必要があります。しかし、追加する裁判官は:碁盤目の動きがない場合には、実用的な意味での右側のグリッドは意味がありませんので、これはとして記録宣告される特別なものである「左側に右側のボックス。」
具体的にコードを見て。

#include<bits/stdc++.h>
using namespace std;
int m[10][10],n,cm[10][10][10],Finished = 0,tot[10][3],num = -1;
void update(){
    for(int i = 0; i < 5; ++i){
        int space = 0;
        for(int j = 0; j < 7; j++){
            if(!m[i][j]) space++;
            else{
                if(!space)continue;
                swap(m[i][j],m[i][j - space]);
            }
        }
    }
}
bool remove(){
    int era[10][10] = {0},flag = 0;
    for(int i = 0; i < 5; i++)
        for(int j = 0; j < 7; j++){
            if(!m[i][j]) continue;
            if(m[i][j] == m[i][j + 1] && m[i][j] == m[i][j - 1] && j != 0 && j != 6){
                era[i][j] = era[i][j + 1] = era[i][j - 1] = 1;
                flag = 1;
            }
            if(m[i][j] == m[i + 1][j] && m[i - 1][j] == m[i][j] && i != 0 && i != 4){
                era[i][j] = era[i + 1][j] = era[i - 1][j] = 1;
                flag = 1;
            }
        }
    if(!flag) return 0;
    for(int i = 0; i < 5; i++)
        for(int j = 0; j < 7; j++){
            if(era[i][j]) {
                m[i][j] = 0;
            }
        }
    return flag;
}
void move(int x,int y){
    swap(m[x + 1][y],m[x][y]);
    update();
    while(remove()) update();
}
bool Is_Finished(){
    for(int i = 0; i < 5; i++)
        if(m[i][0]) return false;
    return true;
}
void copy(int k){
    for(int i = 0; i < 5; i++)
        for(int j = 0; j < 7; j++)
            cm[k][i][j] = m[i][j];  
}
void paste(int k){
    for(int i = 0; i < 5; i++)
        for(int j = 0; j < 7; j++)
            m[i][j] = cm[k][i][j];  
}
void dfs(int cnt){
    if(Is_Finished()) {
            num = cnt;
            Finished = 1; 
            for(int i  = 0; i < num; i++)
                cout << tot[i][0] << " " << tot[i][1] << " " << tot[i][2] << endl;
            exit(0);
    }       
    if(cnt == n) return;
    copy(cnt);
        if(Is_Finished()) { Finished = 1; num = cnt; return; }
        for(int i = 0; i < 4; i++)
            for(int j = 0; j < 7; j++){
                if(!m[i][j] && !m[i + 1][j]) break;
                
                if(m[i][j]){
                    tot[cnt][0] = i;
                    tot[cnt][1] = j;
                    tot[cnt][2] = 1;
                }
                else{
                    tot[cnt][0] = i + 1;
                    tot[cnt][1] = j;
                    tot[cnt][2] = -1;
                }
                move(i,j);
                dfs(cnt + 1);
                if(Finished) return;
                paste(cnt); 
            }
}
int main(){
    cin >> n;
    for(int i = 0; i < 5; i++){
        int x,tot = 0;
        cin >> x;
        while(x){
            m[i][tot++] = x;
            cin >> x;
        }
    }
    dfs(0);
    if(num == -1) cout << -1;
    return 0;
} 

おすすめ

転載: www.cnblogs.com/FoxC/p/11614317.html