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 }
  • 相关阅读:
    ADF中遍历VO中的行数据(Iterator)
    程序中实现两个DataTable的Left Join效果(修改了,网上第二个DataTable为空,所处的异常)
    ArcGIS api for javascript——鼠标悬停时显示信息窗口
    ArcGIS api for javascript——查询,然后单击显示信息窗口
    ArcGIS api for javascript——查询,立刻打开信息窗口
    ArcGIS api for javascript——显示多个查询结果
    ArcGIS api for javascript——用图表显示查询结果
    ArcGIS api for javascript——查询没有地图的数据
    ArcGIS api for javascript——用第二个服务的范围设置地图范围
    ArcGIS api for javascript——显示地图属性
  • 原文地址:https://www.cnblogs.com/mzchuan/p/11189554.html
Copyright © 2011-2022 走看看