您的位置:首页 > 其它

Hihocoder 1426 E. What a Ridiculous Election (BFS)

2017-07-16 18:29 197 查看

Problem

12345
可以经过若干次操作转换为其它五位数。

操作分三种,分别为:

交换相邻两数

选择一位 +1,若大于 9 ,则对 10 取模

选择一位 *2 ,若大于 9,则对 10 取模

其中操作 2 最大进行 3 次,操作 3 最多进行 2 次。

对于给定的五位数,求
12345
在满足限制条件情况下,最少通过几步操作可以转换为目标五位数。若不可能,则输出 -1 。

解题思路

BFS 预处理产生
12345
能够变换出的所有可能五位数,记录操作 2 和操作 3 的次数作为限制。

代码

#include<bits/stdc++.h>
using namespace std;
int minStp[100000][4][3];
string str;
struct Node {
string s;   int op2, op3, stp;
Node() {};
Node(string _s, int _op2, int _op3, int _stp) {
s = _s, op2 = _op2, op3 = _op3, stp = _stp;
}
} p, q;
bool operator<(Node a, Node b) {
return a.stp > b.stp;
}
int str2int(string s) {
int ret = 0;
for(int i=0;i<5;i++)
ret *= 10,  ret += s[i]-'0';
return ret;
}
void bfs()
{
priority_queue<Node> que;
que.push(Node("12345", 0, 0, 0));
minStp[12345][0][0] = 0;
int num;
while(!que.empty())
{
p = que.top();
que.pop();
q.stp = p.stp + 1;
for(int i=0;i<4;i++)
{
q.s = p.s;
swap(q.s[i], q.s[i+1]);
q.op2 = p.op2,  q.op3 = p.op3;
num = str2int(q.s);
if(minStp[num][q.op2][q.op3] != 0x3f3f3f3f) continue;
minStp[num][q.op2][q.op3] = q.stp;
que.push(q);
}

if(p.op2 < 3) {
for(int i=0;i<5;i++)
{
q.s = p.s;
q.s[i] = char(((q.s[i]-'0')+1)%10 + '0');
q.op2 = p.op2+1,    q.op3 = p.op3;
num = str2int(q.s);
if(minStp[num][q.op2][q.op3] != 0x3f3f3f3f) continue;
minStp[num][q.op2][q.op3] = q.stp;
que.push(q);
}
}

if(p.op3 < 2) {
for(int i=0;i<5;i++)
{
q.s = p.s;
q.s[i] = char(((q.s[i]-'0')*2)%10 + '0');
q.op2 = p.op2,  q.op3 = p.op3+1;
num = str2int(q.s);
if(minStp[num][q.op2][q.op3] != 0x3f3f3f3f) continue;
minStp[num][q.op2][q.op3] = q.stp;
que.push(q);
}
}
}
}
int main()
{
memset(minStp, 0x3f, sizeof(minStp));
bfs();
while(cin>>str)
{
int mn = 0x3f3f3f3f;
for(int i=0;i<=3;i++)
for(int j=0;j<=2;j++)
mn = min(mn, minStp[str2int(str)][i][j]);

printf("%d\n", mn==0x3f3f3f3f?-1:mn);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: