2016 ACM/ICPC 区域赛(北京) E 题 bfs

https://vjudge.net/problem/UVALive-7672

题意    输入一个五位数n 问由12345变到n的操作最少次数 不可达输出-1

有三种操作

1.交换相邻的位置 次数不限制

2.使某一位上的数字+1   最多使用三次 (mod 10)

3.使某一位上的数字*2   最多使用两次    (mod 10)

解析 很容易想到预处理,然后O(1) 查询,操作次数最少,所以就bfs,一层一层向外拓展。

需要注意的是 一个数被访问过还可以再被访问(进队列),因为得到一个数可以有不同的操作方案,我们都需要将它向下进行扩展

比如说 26345

可   以    12345->22345(1+1)->23345->26345 (两次2操作,一次3操作)

还可以    12345->22345(1 * 2)->23345->26345 (一次2操作,两次3操作)

两个状态都要进队列才能满足答案正确性。然后开个三维数组记录vis[26345][2][1]标记这个状态访问过了。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int inf=0x3f3f3f3f;
 4 int ans[100000][1];
 5 int vis[100000][4][3]; //0 swap,1 +,2 double
 6 struct node
 7 {
 8     string s;
 9     int a,b,c;
10 };
11 int change(string s)//string 转int
12 {
13     int x=1,ans=0;
14     for(int i=s.length()-1;i>=0;i--)
15     {
16         ans+=(int)(s[i]-‘0‘)*x;
17         x*=10;
18     }
19     return ans;
20 }
21 void bfs()
22 {
23     memset(ans,inf,sizeof(ans));
24     memset(vis,0,sizeof(vis));
25     queue<node>q;
26     string beg="12345";
27     q.push({beg,0,0,0});
28     ans[change(beg)][0]=0;
29     while(!q.empty())
30     {
31         node e=q.front();
32         string now=e.s;q.pop();
33         int noww=change(now);
34         if(e.b<3)
35         {
36             for(int i=0;i<5;i++)
37             {
38                 string t=now;
39                 if(t[i]==‘9‘) t[i]=‘0‘;
40                 else t[i]++;
41                 int temp=change(t);
42                 if(!vis[temp][e.b+1][e.c])
43                 {
44                     vis[temp][e.b+1][e.c]=1;
45                     ans[temp][0]=min(ans[temp][0],e.a+e.b+e.c+1);
46                     q.push({t,e.a,e.b+1,e.c});
47                 }
48             }
49         }
50         if(e.c<2)
51         {
52             for(int i=0;i<5;i++)
53             {
54                 string t=now;
55                 int k=t[i]-‘0‘;
56                 k+=k,k%=10;
57                 t[i]=‘0‘+k;
58                 int temp=change(t);
59                 if(!vis[temp][e.b][e.c+1])
60                 {
61                     vis[temp][e.b][e.c+1]=1;
62                     ans[temp][0]=min(ans[temp][0],e.a+e.b+e.c+1);
63                     q.push({t,e.a,e.b,e.c+1});
64                 }
65             }
66         }
67         for(int i=0;i<4;i++)
68         {
69             string t=now;
70             swap(t[i],t[i+1]);
71             int temp=change(t);
72             if(ans[temp][0]==inf)
73             {
74                 ans[temp][0]=min(ans[temp][0],e.a+e.b+e.c+1);
75                 q.push({t,e.a+1,e.b,e.c});
76             }
77         }
78     }
79 }
80 int main()
81 {
82     bfs();
83     string s;
84     while(cin>>s)
85     {
86         int x=change(s);
87         if(ans[x][0]==inf)
88             cout<<-1<<endl;
89         else
90             cout<<ans[x][0]<<endl;
91     }
92 }

原文地址:https://www.cnblogs.com/stranger-/p/10080206.html

时间: 2024-08-30 01:53:50

2016 ACM/ICPC 区域赛(北京) E 题 bfs的相关文章

08年acm区域赛北京赛区 部分题解题报告

08年区域赛北京赛区 http://poj.org/searchproblem?field=source&key=Beijing+2008 POJ 3921 Destroying the bus stations 题目还是比较难的,当时的榜似乎只有4/25的通过/提交,其实题目数据很水.学长转换模型写了网络流求最小割,可以AC,不过自己造了个数据推翻了正确性.我写了个很挫的bfs套bfs,外层是最小的删除点数,内层是求最短路,数据很水可以AC.但比较蛋疼的在于bfs耗内存,而且队列中的点数是阶乘

2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)

摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5984 Pocky 题意 给出一根棒子(可以吃的)的长度x和切割过程中不能小于的长度d,每次随机的选取一个位置切开,吃掉左边的一半,对右边的棒子同样操作,直至剩余的长度不大于d时停止.现在给出x和d,问切割次数的数学期望是多少. 解题思路 当看到第二个样例2 1时,结果是1.693147,联想到ln

hdu 5868 2016 ACM/ICPC Asia Regional Dalian Online 1001 (burnside引理 polya定理)

Different Circle Permutation Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 208    Accepted Submission(s): 101 Problem Description You may not know this but it's a fact that Xinghai Square is

hdu 5881 Tea (2016 acm 青岛网络赛)

原题地址:http://acm.hdu.edu.cn/showproblem.php?pid=5881 Tea Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 451    Accepted Submission(s): 124 Problem Description Tea is good. Tea is life. Tea is e

2015年ACM长春区域赛比赛感悟

距离长春区域赛结束已经4天了,是时候整理一下这次比赛的点点滴滴了. 也是在比赛前一周才得到通知要我参加长春区域赛,当时也是既兴奋又感到有很大的压力,毕竟我的第一场比赛就是区域赛水平,还是很有挑战性的.在接到通知后,我便开始临阵抱佛脚,课也不怎么听了,上课把时间全都用在了看各种算法上,回到实验室便整理模板.开cf练手.在去比赛前,已经将所看过的算法模板都整理好了. 周五上午9点三刻左右,我们便出发了,需要经历12个小时才能到达我们此次的目的地——长春,途中我还将计算几何稍微看了一下.直到晚上11点

2016 ACM/ICPC Asia Regional Dalian Online 1006 /HDU 5873

Football Games Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 439    Accepted Submission(s): 157 Problem Description A mysterious country will hold a football world championships---Abnormal Cup

HDU 5785 Function 【倍增】 (2016 ACM/ICPC Asia Regional Dalian Online)

Function Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 976    Accepted Submission(s): 375 Problem Description The shorter, the simpler. With this problem, you should be convinced of this tru

2016 ACM/ICPC Asia Regional Shenyang Online 1007/HDU 5898 数位dp

odd-even number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 388    Accepted Submission(s): 212 Problem Description For a number,if the length of continuous odd digits is even and the length

HDU 5889 Barricade 【BFS+最小割 网络流】(2016 ACM/ICPC Asia Regional Qingdao Online)

Barricade Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 997    Accepted Submission(s): 306 Problem Description The empire is under attack again. The general of empire is planning to defend his