8つのデジタル
書式#include <キュー>
書式#include <stdio.hに>
する#include <iostreamの>
書式#include <string.hの>
名前空間stdを使用。
const int型LEN = 362880;
構造体ノード
{
INT状態[9]。
INT DIS;
}。
INTのDIR [4] [2] = {{ - 1,0}、{0、-1}、{1,0}、{0,1}}。
int型訪問[LEN] = {0}。
int型開始[9]。
int型の目標[9]。
長いINT工場[] = {1,1,2,6,24,120,720,5040,40320,362880}。
ボイドスワップ(int型B、INT)
{
int型C = 0。
C =。
A = B。
B = C。
}
BOOLカントール(INT STR []、INT N)
{
COUT << "ハロー" << ENDL。
長い結果= 0;
(INT iについては、= 0、I <N。
{
用(INT J = I + 1、J <nであり、j ++)
{
IF(STR [I]> STR [J])
{
++カウント;
}
}
結果+ =カウント*工場[NI-1]。
}
場合(訪問[結果]!)
{
訪問[結果] = 1。
1を返します。
}
他
{
0を返します。
}
}
int型BFS()
{
ノードヘッド。
memcpyを(head.state、スタート、はsizeof(head.state));
head.dis = 0;
キュー<ノード> Q;
カントール(head.state、9)。
q.push(ヘッド)
一方、(q.empty()!)
{
ヘッド= q.front()。
q.pop();
int型Z;
用(Z = 0; Z <9; Z ++)
{
IF(head.state [Z] == 0)
{
ブレーク;
}
}
int型X = Z%3。
INT Y = Z / 3。
printf( "head.state [%のD] =%dの"、Z、head.state [Z])。
以下のために(INT I 0 =; I <4; ++ I)
{
int型newx = X + DIR [I] [0]。
INT newy = Y + DIR [I] [1]。
int型NZ = newx + 3 * newy。
IF(newx> = 0 && newx <3 && newy> = 0 && newy <3)
{
ノードnewnode。
memcpy(&newnode、&ヘッド、はsizeof(構造体ノード))。
スワップ(newnode.state [z]は、newnode.state [NZ])。
newnode.dis ++;
(memcmp(newnode.state、目標、はsizeof(目標))== 0)であれば
{
戻りnewnode.dis。
IF(カンター(newnode.state、9))
{
q.push(newnode)。
}
}
}
リターン-1。
}
メインINT()
{
(INTはI = 0 ++ iは; I <9)のための
{
CIN >> [i]の開始。
// coutの<< [i]を開始。
}
COUT << "输入的棋盘:" << ENDL。
用(INT iは= 1; I <= 9; ++ I)
{
COUT << [I-1] <<」「開始。
IF(I%3 == 0)COUT << ENDL。
}
のための(INT I = 0; I <9; ++ I)CIN >>ゴール[I]。
裁判所未満<< "目标的棋盘:" <<てendl;
以下のために(INT I 1 =; I <= 9; ++ I)
{
COUT <<目標[I-1] <<」「。
IF(I%3 == 0)COUT << ENDL。
}
INT NUM = BFS()。
もし(NUM =! - 1)
{
coutの<< NUM <<てendl;
}
他
{
COUT << "不可" << ENDL。
}
0を返します。
}