AcWing 1107. 魔板(y总代码的基础上的一维转化)
原题链接
简单
作者:
Accepting
,
2020-09-02 20:02:16
,
所有人可见
,
阅读 5824
鄙人不才,此中鄙陋甚多,望海涵!!!
话不多说,上代码,只是在y总代码的基础上将状态转化变成了一维,代码量会少一些!
C++ 代码
#include<iostream>
#include<unordered_map>
#include<queue>
#include<algorithm>
using namespace std;
unordered_map<string,int> dist;
unordered_map<string,pair<char,string>> pre;
string start,ed,res;
string move0(string t)
{
for(int i=0;i<4;i++) swap(t[i],t[7-i]);
return t;
}
string move1(string t)
{
for(int i=0;i<3;i++) swap(t[3],t[i]);
for(int i=4;i<7;i++) swap(t[i],t[i+1]);
return t;
}
string move2(string t)
{
swap(t[1],t[2]),swap(t[5],t[6]),swap(t[1],t[5]);
return t;
}
void bfs()
{
queue<string> q;
q.push(start);
while(q.size())
{
string t=q.front();
q.pop();
if(t==ed) return;
string m[3];
m[0]=move0(t);
m[1]=move1(t);
m[2]=move2(t);
for(int i=0;i<3;i++)
{
if(!dist.count(m[i]))
{
q.push(m[i]);
dist[m[i]]=dist[t]+1;
pre[m[i]]={'A'+i,t};
}
}
}
}
int main()
{
for(int i=0;i<8;i++)
{
int x;
cin>>x;
ed+=char(x+'0');
start+=char(i+'1');
}
bfs();
cout<< dist[ed] <<endl;
if(dist[ed])
{
while(ed!=start)
{
res+=pre[ed].first;
ed=pre[ed].second;
}
reverse(res.begin(),res.end());
cout<< res <<endl;
}
return 0;
}
创作不易,如果您觉得对您有帮助,就点个赞支持一下!您的赞就是我持续更新优质题解的动力!
其实可以不用dist,pre可以实现判重,res的大小是操作步数。
这个优化确实可以,构造了一个单纯的bfs树
666
又简化了,还有注释,可惜评论区没有点赞不然我按爆它
请问为什么不reverse也可以过
拼接那里是拼接在前面的
感谢
不会实现字典序
谢谢大佬,突然感觉这题能写了
orz orz orz orz
tql%%% tql%%%
大佬,很强
d.count(a) 和d[a]的区别是什么?
count表示的应该是数量吧,d[a]是值吧
正常情况下用d[a]没有问题,但是如果d[a]为0的话就不对。假如d[a]赋值为0,d.count(a)就是1,count能体现出来是否赋值过。无论赋值是0还是多少,count就是1
强的离谱~
大佬为什么是A操作优先B,C操作在后
字典序最小
大佬为什么A<b<c啊
直接比较字母比较的就是字母的ASCII码,你查查表就知道他们三个的ASCII码的大小关系了
hhh我傻了,我看视频的时候还以为是,ABC三种操作对应出来的string的大小关系呢…越想越不对劲…蟹蟹大佬
空间其实没优化多少,但结构清晰很多
pre[m[i]]={‘A’+i,t}; // 这句话的意思是由t变为 m[i] 的操作为 ‘A’+i
Orz
简化好多,按了五次点赞了 (doge)
hhh,谢谢
可以可以简化了很多
hhh,谢谢
tql