Hihocoder 1426 E. What a Ridiculous Election (BFS)

来源:互联网 发布:c语言编写 玫瑰花 编辑:程序博客网 时间:2024/05/20 08:42

Problem

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

操作分三种,分别为:

  1. 交换相邻两数
  2. 选择一位 +1,若大于 9 ,则对 10 取模
  3. 选择一位 *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);    }}