zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    bean的singleton(没有看到生命周期范围??)
    ApplicationContext中getBean详解
    mybatis基础之二
    mybatis基础之一
    JDOM读取xml
    SSH整合最简单的一个例子
    基础学习问题
    2015年2.9--2.15号第一周计划
    freertos的钩子函数
    IAR环境搭建注意点
  • 原文地址:https://www.cnblogs.com/mzchuan/p/11189554.html
Copyright © 2011-2022 走看看