码迷,mamicode.com
首页 > 其他好文 > 详细

八位数

时间:2018-10-04 18:59:02      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:amp   str   一个   pop   efi   size   cout   oid   strlen   

我真的服了, bfs+康拓展开,当然,这是比较低级的做法,今后我再更新其他的做法

八位数问题好像还是挺有名的

题目就是给你一个3*3的矩阵里面填装这 1-8的数字  空了一个格子,我们的目的就是让这个矩阵排列成

1 2 3

4 5 6

7 8 x       x是空出来的

方法一:把 x看成9,从1 2 3 4 5 6 7 8 9,搜索所有的状态,记录到达所有状态的路径,输入一个起始状态,直接输出路径

这是最蠢的办法,我看到网上有很多A*,双向bfs的,深感自己的弱小

(我一开始用的map超时)

#include<iostream>
#include<queue>
#include<cstring>
#include<vector>
#include<cstdio>
#include<cmath>
#include<map>
#include<string>
using namespace std;
#define ll long long
#define se second
#define fi first
#define oo 0x3fffffff
const int maxn = 400000;
bool hashs[maxn];
string path[maxn];
int fac[]={1,1,2,6,24,120,720,5040,40320,362880};
int dx[4] = {1,-1,0,0};
int dy[4] = {0,0,1,-1};
char op[5] = "udlr";
struct node
{
    int s[9];
    int pos;
    int val;
    string path;
};
int tocon(int a[])
{
    int x = 0;
    for(int i = 0; i <= 8; ++i)
    {
        int k = 0;
        for(int j = i+1; j <= 8; ++j)
            if(a[j] > a[i]) k ++;
        x += k*fac[9-i-1];
    }
    return x;
}
void bfs()
{
    int num[9];
    memset(hashs,0,sizeof(hashs));
    node st,ed;
    for(int i = 0; i < 9; ++i)
        st.s[i] = i+1;
    st.val = tocon(st.s);
    st.path = "";
    path[st.val] = "";
    hashs[st.val] = true;
    st.pos = 8;
    queue<node> q;
    q.push(st);
    while(!q.empty())
    {
        st = q.front();
        q.pop();

        for(int i = 0; i < 4; ++i)
        {
            int xx = st.pos/3+dx[i];
            int yy = st.pos%3+dy[i];
            if(xx >= 0 && xx <= 2 && yy >= 0 && yy <= 2)
            {
                ed.pos = xx*3 + yy;
                for(int i = 0; i < 9; ++i)
                    ed.s[i] = st.s[i];
                //for(int i = 0 ; i < 9; ++i)
                  //  cout << ed.s[i];
                    //cout << endl;
                swap(ed.s[ed.pos],ed.s[st.pos]);
                ed.val = tocon(ed.s);
                if(!hashs[ed.val])
                {
                    hashs[ed.val] = true;
                    ed.path = op[i] + st.path;
                    path[ed.val] = ed.path;
                    q.push(ed);
                }
            }
        }
    }
}
int main()
{
    char str[150];
    bfs();
    while(gets(str))
    {
        int s[9];
        int l = 0;
        for(int i = 0; i < strlen(str); ++i)
        {
            if(str[i] <= 9 && str[i] >= 0)
                s[l++] = str[i] - 0;
            else if(str[i] == x)
                s[l++] = 9;
        }
        int k = tocon(s);
        if(hashs[k]) cout << path[k] << endl;
        else
            cout << "unsolvable" << endl;
    }
}

 

八位数

标签:amp   str   一个   pop   efi   size   cout   oid   strlen   

原文地址:https://www.cnblogs.com/mltang/p/9742744.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!