题目链接:

E - What a Ridiculous Election

 UVALive - 7672

题目大意:

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

操作分三种,分别为:

操作1:交换相邻两数
操作2:选择一位 +1,若大于 9 ,则对 10 取模。
操作3:选择一位 *2 ,若大于 9,则对 10 取模。
其中操作 2 最大进行 3 次,操作 3 最多进行 2 次。

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

具体思路:bfs,需要从12345作为起点向其他点跑,把所有情况都算出来、不能输入一个数作为起点。

a[i][j][k]代表12345变成i需要操作二j次,操作三k次,每一次输出遍历j和k就可以了。

AC代码:

 #include<bits/stdc++.h>
using namespace std;
# define ll long long
# define inf 0x3f3f3f3f
const int maxn = 1e5+;
int a[maxn][][];
int sto[];
struct node
{
int num;
int add;
int dou;
int step;
node() {}
node(int xx,int yy,int zz,int kk)
{
num=xx;
add=yy;
dou=zz;
step=kk;
}
};
int cal()
{
int ans=;
for(int i=; i<=; i++)
{
ans=ans*+sto[i];
}
return ans;
}
void chuan(int n)
{
sto[]=n%;
n/=;
sto[]=n%;
n/=;
sto[]=n%;
n/=;
sto[]=n%;
n/=;
sto[]=n%;
n/=;
for(int i=; i<=; i++)
{
swap(sto[i],sto[-i+]);
}
}
void bfs()
{
queue<node>q;
q.push(node(,,,));
a[][][]=;
int tmp;
while(!q.empty())
{
node top=q.front();
q.pop();
chuan(top.num);
if(top.add+<=)
{
for(int j=; j<=; j++)
{
tmp=sto[j];
sto[j]++;
sto[j]%=;
int tt=cal();
if(a[tt][top.add+][top.dou]==inf)
q.push(node(tt,top.add+,top.dou,top.step+)),a[tt][top.add+][top.dou]=top.step+;
sto[j]=tmp;
}
}
if(top.dou+<=)
{
for(int j=; j<=; j++)
{
tmp=sto[j];
sto[j]<<=;
sto[j]%=;
int tt=cal();
if(a[tt][top.add][top.dou+]==inf)
{
q.push(node(tt,top.add,top.dou+,top.step+)),a[tt][top.add][top.dou+]=top.step+;
}
sto[j]=tmp;
}
}
for(int j=; j<; j++)
{
swap(sto[j],sto[j+]);
int tt=cal();
if(a[tt][top.add][top.dou]==inf)
{
q.push(node(tt,top.add,top.dou,top.step+)),a[tt][top.add][top.dou]=top.step+;
}
swap(sto[j],sto[j+]);
}
}
}
int main()
{
memset(a,inf,sizeof(a));
bfs();
// chuan(12345);
int n;
int ttt ;
while(~scanf("%d",&n))
{
int minn = inf;
for(int i=; i<=; i++)
{
for(int j=; j<=; j++)
{
minn = min( minn, a[n][i][j] );
}
}
printf("%d\n",minn==inf ? - : minn);
}
return ;
}

 

最新文章

  1. C++ std::array
  2. Hibernate中对象的三个状态解析
  3. Android成长日记-使用ToggleButton实现灯的开关
  4. http://blog.csdn.net/chenleixing/article/details/43740759
  5. Bootstrap_警示框
  6. navigationBar设置透明
  7. Linux下CPU占用率高分析方法
  8. hdu 1877 又一版 A+B
  9. 201521123037 《Java程序设计》第12周学习总结
  10. hdu 1496 Equations hash表
  11. [置顶] xamarin android Fragment实现底部导航栏
  12. Android开发学习之路--UI之自定义布局和控件
  13. HDU 5965(三行扫雷 dp)
  14. idea 自动换行
  15. 如何使用 eclipse进行断点 debug 程序
  16. harbor Configuring Harbor with HTTPS Access
  17. python 全栈开发,Day8(文件操作)
  18. mongoDB的安装与连接
  19. MySQL数据库----多表查询
  20. Android-SDCardUtil-工具类

热门文章

  1. triplet loss 在深度学习中主要应用在什么地方?有什么明显的优势?
  2. Python是如何实现生成器的原理
  3. windows 比较文件命令--fc
  4. javascript生成指定范围的随机整数
  5. Jekins相关笔记
  6. Sumdiv POJ 1845
  7. Mdoelsim10.4怎么脚本单独仿真ISE14.7 IP核
  8. GDOI2018游记&amp;题解
  9. 2.4 random 模块
  10. dajngo cache,throttling