タイトル説明
ボード上の3×3、振り子8個は、各ピースは1〜8の番号が付いています。チェス盤のスペースを残して、スペースが0で表現されます。作品はスペース空白の周りに移動することができます。解決すべき問題は、初期レイアウト(初期状態)とターゲット・レイアウト(やすい被験体を作るために、目標状態が123804765に設定されている)、移動のステップの最小数を見つけるための方法、レイアウトターゲットのレイアウトから初期転移を与えます。
入力形式
初期状態を入力し、スペースに代表される行番号9、0
出力フォーマット
唯一の行、行だけ移動の最小数を表しつの番号は、(具体的試験データはないが、ターゲット状態データを達することはできません)初期状態から目標状態に必要としています
個人的な感情、この問題は、9桁である、扱いやすい数年で9つの位置でもできますが、と付け加えました
(*(4 ^ 9)9)、許容O以上のものをカウントします
#include<map>
#include<queue>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int dx[]={-1,0,0,1},dy[]={0,-1,1,0};
queue<int>q;
map<int,int>m;
int n;
signed main(){
cin>>n;
q.push(n);
m[n]=0;
while(q.size()){
int u=q.front();
int c[3][3],f=0,g=0,n=u;q.pop();
if(u==123804765)break;
for(int i=2;i>=0;i--)
for(int j=2;j>=0;j--){
c[i][j]=n%10,n/=10;
if(!c[i][j])f=i,g=j;
}
for(int i=0;i<4;i++){
int nx=f+dx[i],ny=g+dy[i],ns=0;
if(nx<0||ny<0||nx>2||ny>2)continue;
swap(c[nx][ny],c[f][g]);
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
ns=ns*10+c[i][j];
if(!m.count(ns)){
m[ns]=m[u]+1;
q.push(ns);
}
swap(c[nx][ny],c[f][g]);
}
}
cout<<m[123804765]<<endl;
}