E - Dragon's Cruller

题目链接:
题意:八数码类似的题目,数字华容道,但是不同点在于格子可以上下左右移动,并且越界移动可以从另一边出来,并且横纵移动有不同的花费
解题思路:简单bfs啊!现在竟然还有一点点的觉得有很多题都是算法题,是自己能力范围之外的,其实不然,比如这一题就是一道简单bfs外加上unordered_map维护一下就够了呐,(其实本质上就是hash)
另外还有一种标记方式为康托展开,下一篇详细描述一下。


#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

ll sc,vc;


struct node
{
    int a[10],pos;
    ll cost;
    ll now;
    friend bool operator <(node a,node b)
    {
        return a.cost>b.cost;
    }
};
//bool cmp(node a,node b)
//{
// return a.cost<b.cost;
//}
priority_queue<node>Q;

node enl(node a,int p,int cost)
{
    node ans;
    int tem=a.a[p];
    for(int i=0;i<9;i++)
    {
        ans.a[i]=a.a[i];
    }
    ans.a[p]=0;
    ans.a[a.pos]=tem;
    ll lin=0;
    for(int i=0;i<9;i++)
    {
        lin=lin*10+(ll)ans.a[i];
    }
    ans.now=lin;
    ans.cost=a.cost+cost;
    ans.pos=p;
    return ans;
}

int main()
{

// ios::sync_with_stdio(false);
// cout.tie(NULL);
    while(cin>>sc>>vc)
    {
        if(sc==0&&vc==0)break;
        unordered_map<ll,bool>mp;
        while(!Q.empty())Q.pop();
        int st[10];ll lin=0;
        int et[10];ll fin=0;
        for(int i=0;i<9;i++)
        {
            cin>>st[i];
            lin=lin*10+(ll)st[i];
        }

        for(int i=0;i<9;i++)
        {
            cin>>et[i];
            fin=fin*10+(ll)et[i];
        }
        node ss;
        for(int i=0;i<9;i++)
        {
            ss.a[i]=st[i];
            if(st[i]==0)ss.pos=i;
        }
        ss.now=lin;
        ss.cost=0;
        Q.push(ss);
        ll ans=0;
        while(!Q.empty())
        {
            node temp=Q.top();
// cout<<temp.now<<endl;
// for(int i=0;i<9;i++)
// cout<<temp.a[i]<<" ";
// cout<<endl;
            Q.pop();
            if(temp.now==fin)
            {
                ans=temp.cost;
                break;
            }
            if(mp.count(temp.now))continue;
            mp[temp.now]=1;
            node A=enl(temp,(temp.pos+1)%9,sc);
            Q.push(A);
            node B=enl(temp,(temp.pos-1+9)%9,sc);
            Q.push(B);
            node C=enl(temp,(temp.pos+3)%9,vc);
            Q.push(C);
            node D=enl(temp,(temp.pos-3+9*9)%9,vc);
            Q.push(D);

        }
        cout<<ans<<endl;

    }
    return 0;
}

全部评论

相关推荐

10-27 17:26
东北大学 Java
点赞 评论 收藏
分享
感性的干饭人在线蹲牛友:🐮 应该是在嘉定这边叭,禾赛大楼挺好看的
点赞 评论 收藏
分享
秋招进行到现在终于能写总结了。完全没想到战线会拉这么长,过程会如此狼狈,不过更应该怪自己太菜了。好在所有的运气都用在了最后,也是有个去处。背景:双2本硕科班,无竞赛,本科一段研究所实习,硕士一段大厂暑期实习但无转正。技术栈是C++&nbsp;&amp;&nbsp;Golang,实习是客户端音视频(而且是鸿蒙端开发),简历两个C++项目一个Golang项目。主要投递岗位:后端,cpp软开,游戏服务端,测开,以及一些不拘泥于Java的岗位。从8月起总共投递123家公司,笔试数不清了,约面大约30家。offer/oc/意向:友塔游戏(第一个offer,面试体验很好,就是给钱好少南瑞继保(计算机科班点击就送(限男生),不...
乡土丁真真:佬很厉害,羡慕~虽然我还没有到校招的时候,也想讲一下自己的看法:我觉得不是CPP的问题,佬的背书双2,技术栈加了GO,有两段实习。投了123,面了30.拿到11个offer。这个数据已经很耀眼了。这不也是CPP带来的吗?当然也不止是CPP。至少来说在这个方向努力过的也会有好的结果和选择。同等学历和项目选java就会有更好的吗?我个人持疑问态度。当然CPP在方向选择上确实让人头大,但是我觉得能上岸,至于最后做什么方向,在我看来并不重要。至于CPP特殊,有岗位方向的随机性,java不是不挑方向,只是没得选而已。也希望自己以后校招的时候能offer满满
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务