Seven Puzzle Aizu

7 パズル

7 パズルは 8 つの正方形のカードとこれらのカードがぴたりと収まる枠で構成されています。それぞれのカードには、互いに区別できるように 0, 1, 2, ..., 7 と番号がつけられています。枠には、縦に 2 個、横に 4 個のカードを並べることができます。

7 パズルを始めるときには、まず枠にすべてのカードを入れます。枠のなかで 0 のカードだけは、上下左右に隣接するカードと位置を交換することができます。たとえば、枠の状態が図(a) のときに、0 のカードの右に隣接した、7 のカードと位置を交換すれば、図(b) の状態になります。あるいは、図(a) の状態から 0 のカードの下に隣接した 2 のカードと位置を交換すれば図(c) の状態になります。図(a) の状態で 0 のカードと上下左右に隣接するカードは 7 と 2 のカードだけなので、これ以外の位置の入れ替えは許されません。

ゲームの目的は、カードをきれいに整列して図(d) の状態にすることです。最初の状態を入力とし、カードをきれいに整列するまでに、必要な最小手数を出力するプログラムを作成してください。ただし、入力されたカードの状態からは図(d) の状態に移ることは可能であるとします。

入力データは、1 行に 8 つの数字が空白区切りで与えられます。これらは、最初の状態のカードの並びを表します。例えば、図(a) の数字表現は0 7 3 4 2 5 1 6に、図(c) は 2 7 3 4 0 5 1 6 となります。

图b

             图a                        图b

            图c                            图d

Input

上記形式で複数のパズルが与えられます。入力の最後まで処理してください。 与えられるパズルの数は 1,000 以下です。

Output

各パズルについて、最終状態へ移行する最小手数を1行に出力してください。

Sample Input

0 1 2 3 4 5 6 7
1 0 2 3 4 5 6 7
7 6 5 4 3 2 1 0

Output for the Sample Input

0
1
28

翻译:
一个4*2的方格存放0到7,八个数,每次只能移动数字0,求方格变成01234567的最小移动步数。

思路:如果按输入的值移动的话有点浪费时间,可以以01234567为初始状态,bfs循环到所有的结果,并存放到map容器中。可以将输入的数存放到一个字符串里,但是要注意输入的是带空格的。

 1 #include <cstdio>
 2 #include <fstream>
 3 #include <algorithm>
 4 #include <cmath>
 5 #include <deque>
 6 #include <vector>
 7 #include <queue>
 8 #include <string>
 9 #include <cstring>
10 #include <map>
11 #include <stack>
12 #include <set>
13 #include <sstream>
14 #include <iostream>
15 #define mod 1000000007
16 #define eps 1e-6
17 #define ll long long
18 #define INF 0x3f3f3f3f
19 using namespace std;
20 
21 string str;
22 int fx[4]={1,-1,4,-4};
23 map<string,int> ma;
24 void bfs()
25 {
26     queue<string> qu;
27     qu.push("01234567");
28     ma["01234567"]=0;
29     while(!qu.empty())
30     {
31         string no=qu.front();
32         qu.pop();
33         int w;
34         for(int i=0;i<8;i++)
35         {
36             if(no[i]=='0')
37             {
38                 w=i;
39                 break;
40             }
41         }
42         for(int i=0;i<4;i++)
43         {
44             int x=w+fx[i];
45             if(x>=0&&x<8&&!(w==3&&i==0)&&!(w==4&&i==1))
46             {
47                 string ne=no;
48                 swap(ne[w],ne[x]);
49                 if(ma.find(ne)==ma.end())
50                 {
51                     ma[ne]=ma[no]+1;
52                     qu.push(ne);
53                 }
54             }
55         }
56     }
57 }
58 int main()
59 {
60     bfs();
61     while(getline(cin,str))
62     {
63         str.erase(remove(str.begin(),str.end(),' '),str.end());
64         cout<<ma[str]<<endl;
65     }
66 }
原文地址:https://www.cnblogs.com/mzchuan/p/11189554.html