这题我们可以用优先队列,每次弹出队列中操作次数最少的一个,那么当找到匹配数时,该值一定是最优的。需要注意的时,加个vi[]数组,判读当前数是否已经存在于队列中。我做的很烦啊~~~

#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
int n,m;
int vi[];
struct Point{
int n,num;
Point(int x,int y)
{
vi[x]=;
n=x;
num=y;
}
int operator <(const Point &temp) const
{
return num>temp.num;
}
}p(,);
priority_queue<Point> q;
int bfs()
{
if(n==m)
return ;
while(!q.empty())
q.pop();
memset(vi,,sizeof(vi));
p.n=n,p.num=;
q.push(p);
int a,b,c,d;
while(!q.empty())
{
p=q.top();
q.pop();
if(p.n==m)
return p.num;
//cout<<p.n<<" "<<p.num<<endl;
a=p.n/;
b=(p.n/)%;
c=(p.n%)/;
d=p.n%;
//cout<<p.n<<endl;
//cout<<a<<" "<<b<<" "<<c<<" "<<d<<endl;
if(a==)
{
if(!vi[+b*+c*+d])
q.push(Point(+b*+c*+d,p.num+));
}
else
if(!vi[p.n+])
q.push(Point(p.n+,p.num+));
if(b==)
{
if(!vi[a*++c*+d])
q.push(Point(a*++c*+d,p.num+));
}
else
if(!vi[p.n+])
q.push(Point(p.n+,p.num+));
if(c==)
{
if(!vi[a*+b*++d])
q.push(Point(a*+b*++d,p.num+));
}
else
if(!vi[p.n+])
q.push(Point(p.n+,p.num+));
if(d==)
{
if(!vi[a*+b*+c*+])
q.push(Point(a*+b*+c*+,p.num+));
}
else
if(!vi[p.n+])
q.push(Point(p.n+,p.num+));
if(a==)
{
if(!vi[+b*+c*+d])
q.push(Point(+b*+c*+d,p.num+));
}
else
if(!vi[p.n-])
q.push(Point(p.n-,p.num+));
if(b==)
{
if(!vi[a*++c*+d])
q.push(Point(a*++c*+d,p.num+));
}
else
if(!vi[p.n-])
q.push(Point(p.n-,p.num+));
if(c==)
{
if(!vi[a*+b*++d])
q.push(Point(a*+b*++d,p.num+));
}
else
if(!vi[p.n-])
q.push(Point(p.n-,p.num+));
if(d==)
{
if(!vi[a*+b*+c*+])
q.push(Point(a*+b*+c*+,p.num+));
}
else
if(!vi[p.n-])
q.push(Point(p.n-,p.num+));
if(!vi[b*+a*+c*+d])
q.push(Point(b*+a*+c*+d,p.num+));
if(!vi[a*+c*+b*+d])
q.push(Point(a*+c*+b*+d,p.num+));
if(!vi[a*+b*+d*+c])
q.push(Point(a*+b*+d*+c,p.num+));
}
}
int main()
{
int t,i,j;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
printf("%d\n",bfs());
}
return ;
}

最新文章

  1. 真正高效的SQLSERVER分页查询(多种方案)
  2. VBA_Excel_教程:Option,错误处理
  3. Linux 信号详解一(signal函数)
  4. 我的Linux对拍脚本
  5. linux下安装+配置+卸载jdk
  6. ZOJ 1045 HangOver
  7. Yii 1 数据库操作 笔记
  8. VB 思维导图总结(三)
  9. sudo
  10. Robotium学习笔记三
  11. Spring 注解回顾
  12. JasperReport使用心得
  13. SWT可视化设计
  14. oracle状态
  15. MS SQL 模仿ORACLE的DESC
  16. unix设计哲学
  17. 一段JAVA代码了解多线程,JUC、CAS原子性操作。
  18. 全局css控制&lt;td&gt;标签属性
  19. Maven的安装、配置及使用入门+maven安装报错:JAVA_HOME【申明:来源于网络】
  20. Complex类的实现

热门文章

  1. Linux下免安装版sublime text 3显示图标
  2. 软件工程(FZU2015)赛季得分榜,第11回合(beta冲刺+SE总结)
  3. GET方法和POST方法
  4. redis常用配置
  5. JavaWeb 4 XML
  6. 译 - EF 6秘诀(第二版) - 目录
  7. HDU 4422 The Little Girl who Picks Mushrooms ( 模拟)
  8. js模板引擎实现原理
  9. 最全的ORACLE-SQL笔记
  10. 【Android】添加菜单和监听菜单方法详解
  11. 1132: 零起点学算法39——多组测试数据(a+b)
  12. aws - shadow 影子使用
  13. James Munkres Topology: Theorem 16.3
  14. 手工脱壳之FSG压缩壳-IAT表修复
  15. JDK版本的特性
  16. Linux学习笔记——Ubuntu更新软件源
  17. Microsoft Office2003打开office2007文件的补丁
  18. Spring 4 官方文档学习(六)核心技术之Spring AOP
  19. ELF文件分析
  20. FIS常用功能之资源压缩