【题意】

  • 现在给出一个三角矩阵,如果0编号的在点(x,y)的话,可以和(x+1,y),(x-1,y),(x+1,y+1),(x-1,y-1)这些点进行交换。
  • 我们每一次只能对0点和其他点进行交换。问最少步数,使得最终变成:

0

1 1

2 2 2

3 3 3 3

4 4 4 4 4

5 5 5 5 5 5

【思路】

【AC】

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. typedef unsigned long long ull;
  5. const int inf=0x3f3f3f3f;
  6. struct node
  7. {
  8. int val[][];
  9. int tp;
  10. int r;
  11. int c;
  12. int step;
  13. }s,t;
  14.  
  15. ull Hash(node t)
  16. {
  17. ull tmp=;
  18. for(int i=;i<;i++)
  19. {
  20. for(int j=;j<=i;j++)
  21. {
  22. tmp=tmp*+t.val[i][j];
  23. }
  24. }
  25. return tmp;
  26. }
  27. queue<node> Q;
  28. map<ull,int> book[];
  29. int dir[][]={{,},{-,},{,},{-,-}};
  30. int bfs(node s,node t)
  31. {
  32. while(!Q.empty()) Q.pop();
  33. book[].clear();
  34. book[].clear();
  35. s.step=t.step=;
  36. s.tp=;t.tp=;
  37. book[s.tp][Hash(s)]=;
  38. book[t.tp][Hash(t)]=;
  39. Q.push(s);Q.push(t);
  40. while(!Q.empty())
  41. {
  42. node q=Q.front(),e;Q.pop();
  43. ull tmp=Hash(q);
  44. if(book[!q.tp].count(tmp))
  45. {
  46. if(book[!q.tp][tmp]+q.step<=)
  47. return book[!q.tp][tmp]+q.step;
  48. else continue;
  49. }
  50. if(q.step>=) continue;
  51. for(int i=;i<;i++)
  52. {
  53. e=q;
  54. e.r+=dir[i][];
  55. e.c+=dir[i][];
  56. if(e.r<||e.r>=||e.c<||e.c>=||e.c>e.r) continue;
  57. swap(e.val[e.r][e.c],e.val[q.r][q.c]);
  58. ull tmp=Hash(e);
  59. if(book[e.tp].count(tmp)) continue;
  60. book[e.tp][tmp]=++e.step;
  61. Q.push(e);
  62. }
  63. }
  64. return inf;
  65. }
  66. int main()
  67. {
  68. int T;
  69. scanf("%d",&T);
  70. while(T--)
  71. {
  72. for(int i=;i<;i++)
  73. {
  74. for(int j=;j<=i;j++)
  75. {
  76. scanf("%d",&s.val[i][j]);
  77. if(s.val[i][j]==)
  78. {
  79. s.r=i;s.c=j;
  80. }
  81. t.val[i][j]=i;
  82. }
  83. }
  84. t.r=t.c=;
  85. int ans=bfs(s,t);
  86. if(ans==inf) puts("too difficult");
  87. else printf("%d\n",ans);
  88. }
  89. return ;
  90. }

【双向bfs】2017多校训练十 HDU 6171 Admiral的更多相关文章

  1. 【构造+DFS】2017多校训练三 HDU 6060 RXD and dividing

    acm.hdu.edu.cn/showproblem.php?pid=6060 [题意] 给定一棵以1为根的树,把这颗树除1以外的结点划分为k个集合(可以有空集),把1加入划分后的集合 每个集合的结点 ...

  2. 【极角排序+双指针线性扫】2017多校训练七 HDU 6127 Hard challenge

    acm.hdu.edu.cn/showproblem.php?pid=6127 [题意] 给定平面直角坐标系中的n个点,这n个点每个点都有一个点权 这n个点两两可以连乘一条线段,定义每条线段的权值为线 ...

  3. 【(好题)组合数+Lucas定理+公式递推(lowbit+滚动数组)+打表找规律】2017多校训练七 HDU 6129 Just do it

    http://acm.hdu.edu.cn/showproblem.php?pid=6129 [题意] 对于一个长度为n的序列a,我们可以计算b[i]=a1^a2^......^ai,这样得到序列b ...

  4. 【链表】2017多校训练三 HDU 6058 Kanade's sum

    acm.hdu.edu.cn/showproblem.php?pid=6058 [题意] 给定一个排列,计算 [思路] 计算排列A中每个数的贡献,即对于每个ai,计算有ni个区间满足ai是区间中的第k ...

  5. 2017多校第10场 HDU 6171 Admiral 双向BFS或者A*搜索

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6171 题意: 给你一个高度为6的塔形数组,你每次只能将0与他上下相邻的某个数交换,问最少交换多少次可以 ...

  6. HDU 6171 Admiral(双向BFS+队列)题解

    思路: 最大步骤有20,直接BFS会超时. 因为知道开始情况和结果所以可以用双向BFS,每个BFS规定最大步骤为10,这样相加肯定小于20.这里要保存每个状态搜索到的最小步骤,用Hash储存.当发现现 ...

  7. 【2017多校训练2+计算几何+板】HDU 6055 Regular polygon

    http://acm.hdu.edu.cn/showproblem.php?pid=6055 [题意] 给定n个格点,问有多少个正多边形 [思路] 因为是格点,只可能是正方形 枚举正方形的对角线,因为 ...

  8. 2017 多校训练 1002 Balala Power!

    Balala Power! Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  9. 2017 多校训练 1006 Function

    Function Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total ...

随机推荐

  1. 将centos6的php5.3升级为5.6

    在阿里云主机上,操作系统是Centos6,php版本是5.3.因为安装Yii2.0的需要,我要升级php为5.4.因为还有5.5和5.6,当然要升到高版本了.我决定升到5.6.   首先,按照这里的步 ...

  2. Caused by: java.lang.ClassNotFoundException: org.springframework.boot.system.JavaVersion

    Caused by: java.lang.ClassNotFoundException: org.springframework.boot.system.JavaVersion Invalid pro ...

  3. leetcode_1095. Find in Mountain Array_[Binary Search]

    https://leetcode.com/problems/find-in-mountain-array/ 题意:给定一个MountainArray(定义见题目),找到其中最早出现的target值的下 ...

  4. C# DateTime.Now函数

    // 2008年4月24日 System.DateTime.Now.ToString( " D " );// 2008-4-24 System.DateTime.Now.ToStr ...

  5. C01 C语言基础

    目录 C语言简史及特点 C语言开发环境 C语言程序结构 C语言基本输入输出函数 编译 软件类型 C语言简要及特点 什么是计算机语言 计算机语言是用于人与计算机之间通讯的语言. 计算机遵照接收到的计算机 ...

  6. bootstrap 按钮组的嵌套

    您可以在一个按钮组内嵌套另一个按钮组,即,在一个 .btn-group 内嵌套另一个 .btn-group .当您想让下拉菜单与一系列按钮组合使用时,就会用到这个. 实例: <!DOCTYPE ...

  7. shell脚本,alias别名命令用法。

    [root@localhost ~]# alias alias cp='cp -i' alias mv='mv -i' alias rm='rm -i' [root@localhost ~]# [ro ...

  8. cookies,sessionStorage和localStorage的相同点和不同点?

    相同点:都存储在客户端. 不同点: 1.存储大小: cookies数据大小不能超过4k sessionStorage和localStorage虽然也有存储大小的限制,但比cookies大得多,可以达到 ...

  9. MySQL常用表结构查询语句

    在我们使用数据库进行查询或者建表时,经常需要查看表结构,下面以employees数据库中的departments表为例进行表结构查询: departments表:(2列9行) +---------+- ...

  10. Git学习——删除文件

    怎么删除版本库中的文件呢? 首先,删除工作区中的文件:rm <file>,然后你有两个选择.其一是,真正删除版库中的文件: git rm <file> git commit - ...