zoukankan      html  css  js  c++  java
  • Seven Puzzle Aizu

    7 パズル

    ime limit1000 ms

    Memory limit131072 kB

    OSLinux

    Source3rd PC Koshien, Final

    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となります。 

    図(a) 0 7 3 4 2 5 1 6 の場合図(b) 7 0 3 4 2 5 1 6 の場合


    図(c) 2 7 3 4 0 5 1 6 の場合図(d) 0 1 2 3 4 5 6 7 (最終状態)

    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

    题意:0-7乱序移到0-7顺序,0算空格可以交换
    题解:bfs,用map,逆向bfs
    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<sstream>
    #include<cmath>
    #include<cstdlib>
    #include<queue>
    #include<map>
    using namespace std;
    #define INF 0x3f3f3f3f
    const int maxn=304;
    
    int dir[]={-4,4,-1,1};   //上下左右
    map<string,int>table;
    void bfs(string st)
    {
        queue<string>q;
        table[st]=1;    //起始状态
        q.push(st);
        while(!q.empty())
        {
            st=q.front(); q.pop();
            int num=st.find('0');
            for(int i=0;i<4;i++)
            {
                int tn=num+dir[i];
                if(tn<0 || tn>7 || (num==3 && dir[i]==1) || (num==4 && dir[i]==-1))
                    continue;
                string tp=st;
                swap(tp[num],tp[num+dir[i]]);
                if(!table[tp])
                {
                    q.push(tp);
                    table[tp]=table[st]+1;
                }
            }
        }
    }
    
    
    int main()
    {
        int num;
        string st="01234567";
        bfs(st);
       while(~scanf("%d",&num))
       {
           st[0]=num+'0';
       
        for(int i=1;i<8;i++)
        {
            scanf("%d",&num);
            st[i]=num+'0';
        }
        printf("%d
    ",table[st]-1);
       }
    }
  • 相关阅读:
    Android 开发 深入理解Handler、Looper、Messagequeue 转载
    Android 开发 Handler的基本使用
    Java 学习 注解
    Android 开发 AlarmManager 定时器
    Android 开发 框架系列 百度语音合成
    Android 开发 框架系列 Google的ORM框架 Room
    Android 开发 VectorDrawable 矢量图 (三)矢量图动画
    Android 开发 VectorDrawable 矢量图 (二)了解矢量图属性与绘制
    Android 开发 VectorDrawable 矢量图 (一)了解Android矢量图与获取矢量图
    Android 开发 知晓各种id信息 获取线程ID、activityID、内核ID
  • 原文地址:https://www.cnblogs.com/smallhester/p/9499824.html
Copyright © 2011-2022 走看看