問題D:[ワイド検索の概要]マジックボード

説明文

ルービックキューブの発明に成功した後、ルービック氏はマジックボードと呼ばれる2次元バージョンを発明しました。これは、同じサイズの8グリッドのマジックボードです
。1 2 3 4
8 7 6 5
マジックボードの各正方形に色があることを知っています。これらの8色は、最初の8つの正の整数で表されます。マジックボードの状態を表す色のシーケンスを使用できます。マジックボードの左上隅から始めて、時計回りに整数を取り出してカラーシーケンスを形成することが規定されています。上の図のマジックボードの状態では、シーケンス(1、2、3、4、5、6、7、8)を使用して表現しています。これが基本状態です。
大文字の「A」、「B」、「C」で表される3つの基本的な操作は次のとおりです(マジックボードの状態はこれらの操作で変更できます):
「A」:上下の2行を入れ替えます。
「B」:右端の列が左端に挿入されます。
「C」:マジックボードの中央にある4つの正方形が時計回りに回転します。
以下は、基本的な状態操作のデモンストレーションです
。A:
8 7 6 5
1 2 3 4
B:
4 1 2 3
5 8 7 6
C:
1 7 2 4
8 6 3 5
考えられる状態ごとに、これら3つの基本的な操作が使用できます。
最低限の基本操作で基本状態からターゲット状態への遷移をプログラミングおよび計算し、一連の基本操作を出力する必要があります。
[入力形式] 8つの整数を含む
テストデータの複数のセット
入力するための1行のみがあり、これらの整数はスペースで区切られ(これらの整数は1〜8の範囲です)、ターゲットの状態を示します。
【出力形式】
1行目:整数を含み、最短演算シーケンスの長さを示します。
2行目:辞書式順序での最も早い操作シーケンスは文字列で表され、最後の行を除いて、各行は60文字を出力します。

 

 

入力例

 

2 6 8 4 5 7 3 1

出力例

7

BCABCCB 

 

最終的なACコード:

#include <bits / stdc ++。h>
 using  namespace std;
 // この質問の難しさは、以前に表示された状態を記録する必要があることです。この質問では、文字列を使用して
 // 示しています。状況(テスト後、すべてのBFS()は ""を返します
 // タイトルは1行あたり60文字しか出力されませんが、60文字を超えるケースはありません... 
struct Node { 
     int M [ 2 ] [ 4 ]; // M save state 
    string s; // 累積演算
} now、nex;
 int des [ 2 ] [ 4 ];
 char op [ 3 ] = { ' A '' B '' C' }; 
map < stringbool > mp;
void getMatrix(char c){
     int i;
    if(c == ' A ' ){
         for(i = 0 ; i < 4 ; i ++)nex.M [ 0 ] [i] = now.M [ 1 ] [i];
        for(i = 0 ; i < 4 ; i ++)nex.M [ 1 ] [i] = now.M [ 0 ] [i]; 
    } else  if(c == ' B ' ){
        for(i = 0 ; i < 2 ; i ++)nex.M [i] [ 0 ] = now.M [i] [ 3 ];
        for(i = 1 ; i < 4 ; i ++)nex.M [ 0 ] [i] = now.M [ 0 ] [i- 1 ];
        for(i = 1 ; i < 4 ; i ++)nex.M [ 1 ] [i] = now.M [ 1 ] [i- 1 ]; 
    } else {
         for(i = 0 ; i < 2 ; i ++)nex.M [i] [ 0 ] = now.M [i] [ 0 ]、nex.M [i] [ 3] = now.M [i] [ 3 ]; 
        nex.M [ 0 ] [ 1 ] = now.M [ 1 ] [ 1 ]、nex.M [ 0 ] [ 2 ] = now.M [ 0 ] [ 1 ]; 
        nex.M [ 1 ] [ 1 ] = now.M [ 1 ] [ 2 ]、nex.M [ 1 ] [ 2 ] = now.M [ 0 ] [ 2 ]; 
    } 
} 
bool Judge(Node node){
     int i、j;
    for(i = 0 ; i < 2 ; i ++ ){
        for(j = 0 ; j < 4 ; j ++)if(node.M [i] [j]!= des [i] [j])return  false ; 
    } 
    trueを返し ます
} 
string getStr(Node node){
     int i;
    文字列str;
    for(i = 0 ; i < 4 ; i ++)str + =(node.M [ 0 ] [i] + ' 0 ' );
    for(i = 0 ; i < 4 ; i ++)str + =(node.M [ 1 ] [i] + ' 0 ' );
    帰るstr; 
} 
string BFS(){
     string str;
    int i、len; 
    now.s = "" ;
    for(i = 0 ; i < 4 ; i ++)now.M [ 0 ] [i] = i + 1 ; 
    now.M [ 1 ] [ 0 ] = 8、now.M [ 1 ] [ 1 ] = 7、now.M [ 1 ] [ 2 ] = 6、now.M [ 1 ] [ 3 ] = 5 ; 
    キュー <ノード> q;
    if(Judge(now))return now.s; 
    q.push(今); 
    mp [getStr(now)] = true ;
    while(!q.empty()){ 
        now = q.front(); 
        q.pop(); 
        for(i = 0 ; i < 3 ; i ++ ){ 
            nex.s = now.s + op [i]; 
            getMatrix(op [i]); 
            if(Judge(nex))return nex.s; 
            str = getStr(nex);
            if(!mp [str]){  
                q.push(nex);
                mp [str] = true ; 
            } 
        } 
    } 
    return  "" ; 
} 
int main(){
     int i;
    文字列ans;
    while(cin >> des [ 0 ] [ 0 ] >> des [ 0 ] [ 1 ] >> des [ 0 ] [ 2 ] >> des [ 0 ] [ 3 ]){ // 输入力第一组 
        cin >> des [ 1 ] [ 3 ] >> des [ 1 ] [ 2 ] >> des [ 1 ] [ 1 ] >> des [ 1 ] [ 0 ]; // 输入第二组
        mp.clear(); 
        ans = BFS(); 
        printf(" %d \ n " 、ans.size());
        for(i = 0 ; i <ans.size(); i ++)printf(" %c " 、ans [i]); 
        printf(" \ n " ); 
    } 
    0を返し ます
}

要約:この質問は、実際には前の質問と同じです。唯一の違いは、発生の状態を記録する必要があることです。それ以外の場合は、無限ループが発生してタイムアウトが発生します。しかし、私は嘔吐したいのですが、この質問の説明、特に出力は本当に良くありません!

おすすめ

転載: www.cnblogs.com/heyour/p/12674467.html