HihoCoder 1426 What a Ridiculous Election (BFS)

来源:互联网 发布:linux时间戳转换命令 编辑:程序博客网 时间:2024/05/09 01:29

思路:预处理12345能到达所有情况的最小步数即可


#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <cmath>#include <cstdlib>#include <ctime>#define INF 0x3f3f3f3f#define esp 1e-9typedef long long LL;using namespace std;const int maxn = 100000;int ans[maxn][5][5];struct Node{    int s[10];int op2,op3;int step;};int change(Node a){    int sum = 0;for(int i = 1;i<=5;i++){    sum+=a.s[i];sum*=10;}return sum/10;}void bfs(Node st){memset(ans,INF,sizeof(ans));    int n = change(st);queue<Node>q;    st.op2 = 3;       //jia 1st.op3 = 2;       // *2st.step = 0;q.push(st);ans[n][st.op2][st.op3]=0;//printf("%d\n",ans[n][st.op2][st.op3]);while(!q.empty()){    Node u = q.front();q.pop();for(int i = 2;i<=5;i++){    Node tmpu = u;swap(tmpu.s[i],tmpu.s[i-1]);int t = change(tmpu);tmpu.step++;if(tmpu.step >= ans[t][tmpu.op2][tmpu.op3])continue;q.push(tmpu);ans[t][tmpu.op2][tmpu.op3]=tmpu.step;}if(u.op2>0){for(int i = 1;i<=5;i++){        Node tmpu = u;tmpu.op2--;tmpu.s[i] =(tmpu.s[i]+1)%10;int t = change(tmpu);tmpu.step++;if(tmpu.step >= ans[t][tmpu.op2][tmpu.op3])continue;q.push(tmpu);ans[t][tmpu.op2][tmpu.op3] = tmpu.step;}}if(u.op3>0){    for(int i = 1;i<=5;i++){    Node tmpu = u;tmpu.op3--;tmpu.step++;tmpu.s[i] = (tmpu.s[i]*2)%10;int t = change(tmpu);if(tmpu.step >= ans[t][tmpu.op2][tmpu.op3])continue;q.push(tmpu);ans[t][tmpu.op2][tmpu.op3]=tmpu.step;}}}//printf("%d\n",ans[12345][3][2]);}char s[10];Node tar;int main(){for(int i = 1;i<=5;i++)tar.s[i]=i;bfs(tar);while(scanf("%s",s+1)!=EOF){int anss = INF;Node a;for(int i = 1;i<=5;i++)a.s[i]=s[i]-'0';int ta = change(a);for(int i = 0;i<=3;i++)for(int j = 0;j<=2;j++)anss = min(anss,ans[ta][i][j]);if(anss==INF)printf("-1\n");else printf("%d\n",anss);}    //freopen("in.txt","r",stdin);    //freopen("out.txt","w",stdout);    return 0;}



0 0
原创粉丝点击