题目链接:点击查看

题目大意:给出一个 6 * 6 的矩阵,表示华容道的游戏界面,现在需要红色汽车(标号为 1 )从第三行最右端到达出口的最短时间,如果无解或者步数超过 10 输出 -1

题目分析:因为最多有十种不同的汽车,所以我们可以直接爆搜,时间复杂度大概 20^8?当然最坏情况肯定远远达不到,具体复杂度我也不太会算

爆搜的话,只需要搜每一步每一种车可能的情况即可,具体实现可以参考代码

需要注意的是,这个题目用 bfs 需要自己写一个结构体封装,然后每次转移状态的时候都需要频繁的调用构造函数,导致常数特别特别大,以至于 TLE ,换成 dfs 的话情况就会好很多,配合一个最优性剪枝就可以顺利通过了(193ms),如果追求极致的话可以用迭代加深来优化这个题目(15ms),效率将会更高,这里只贴一个迭代加深的代码了

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=7;int maze[N][N];struct Car
{int max_x,max_y,min_x,min_y;Car(){max_x=max_y=-1;min_x=min_y=inf;}
}car[11];bool dfs(int step,int mmax)
{int pos=7-car[1].min_y;if(pos+step>mmax)return false;if(maze[3][5]==1&&maze[3][6]==1)return true;for(int i=1;i<=10;i++)//遍历每辆车 {if(car[i].max_x==-1)//不存在 continue;int max_x=car[i].max_x,max_y=car[i].max_y,min_x=car[i].min_x,min_y=car[i].min_y;if(min_x==max_x)//横着 {if(min_y>1&&maze[min_x][min_y-1]==0){car[i].min_y--;car[i].max_y--;swap(maze[min_x][min_y-1],maze[min_x][max_y]);bool flag=dfs(step+1,mmax);swap(maze[min_x][min_y-1],maze[min_x][max_y]);car[i].min_y++;car[i].max_y++;if(flag)return true;}if(max_y<6&&maze[min_x][max_y+1]==0){car[i].min_y++;car[i].max_y++;swap(maze[min_x][max_y+1],maze[min_x][min_y]);bool flag=dfs(step+1,mmax);swap(maze[min_x][max_y+1],maze[min_x][min_y]);car[i].min_y--;car[i].max_y--;if(flag)return true;}}else//竖着 {if(min_x>1&&maze[min_x-1][min_y]==0){car[i].min_x--;car[i].max_x--;swap(maze[min_x-1][min_y],maze[max_x][min_y]);bool flag=dfs(step+1,mmax);swap(maze[min_x-1][min_y],maze[max_x][min_y]);car[i].min_x++;car[i].max_x++;if(flag)return true;}if(max_x<6&&maze[max_x+1][min_y]==0){car[i].min_x++;car[i].max_x++;swap(maze[max_x+1][min_y],maze[min_x][min_y]);bool flag=dfs(step+1,mmax);swap(maze[max_x+1][min_y],maze[min_x][min_y]);car[i].min_x--;car[i].max_x--;if(flag)return true;}}}return false;
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);for(int i=1;i<=6;i++)for(int j=1;j<=6;j++){scanf("%d",&maze[i][j]);if(maze[i][j]){car[maze[i][j]].max_x=max(car[maze[i][j]].max_x,i);car[maze[i][j]].min_x=min(car[maze[i][j]].min_x,i);car[maze[i][j]].max_y=max(car[maze[i][j]].max_y,j);car[maze[i][j]].min_y=min(car[maze[i][j]].min_y,j);}}for(int i=1;i<=10;i++)if(dfs(0,i))return 0*printf("%d\n",i);puts("-1");return 0;
}

Gym - 102460A Rush Hour Puzzle(dfs迭代加深)相关推荐

  1. 紫书搜索 习题7-8 UVA - 12107 Digit Puzzle IDA*迭代加深搜索

    题目链接: https://vjudge.net/problem/UVA-12107 题意: 给出一个数字谜,要求修改尽量少的数,使修改后的数字谜只有唯一解.空格和数字可以随意替换,但不能增删,数字谜 ...

  2. POJ - 2248 Addition Chains(dfs+迭代加深)

    题目链接:点击查看 题目大意:我们规定加法链有如下特点: 现在给出一个数n,求该数的最短加法链 题目分析:这个题首先我们可以枚举所有可能性,并且进行适当的剪枝: 当前长度大于等于最优解时回溯 当前值等 ...

  3. 巴士(DFS迭代加深 + 剪枝)

    原题链接: https://www.acwing.com/problem/content/188/ 题目描述 一名男子在12:00抵达了某巴士站,并且在12:00-12:59期间他将在那里逗留. 巴士 ...

  4. 洛谷 P2534 [AHOI2012]铁盘整理(IDA*(dfs+迭代加深+估值函数))

    题目链接:P2534 [AHOI2012]铁盘整理 题解:本篇为IDA*的应用,做这题前建议先做前一篇文章的题目:点这 这题中难在估值函数的确定,总的来说IDA*基本上格式都差不多,主要难在估值函数的 ...

  5. P2324 [SCOI2005]骑士精神(迭代加深搜索,dfs)

    传送门 文章目录 解析 解析 很显然,让马走的话状态记录和转移都会比较复杂 所以转化成让空位跳会更好做一点 但这不是重点 初看本题,其实第一感觉是bfs 但是状态数理论上最差可以达到815,(当然基本 ...

  6. DFS,BFS和迭代加深的联系与区别

    关于DFS: DFS算法是沿着搜索树的根节点,一直遍历完该搜索树之后再回溯继续搜索的一种算法.缺点是可能会出现答案在搜索树层数很浅,在靠后的子树中,但由于搜索次序需要遍历完一棵搜索树所有的节点,所以导 ...

  7. hdu 1560 DNA sequence(迭代加深搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1560 题意:从n个串中找出一个最短的公共串,,该公共串对于n个字符串不要求连续,即只要保持相对顺序就好 ...

  8. UVA - 11214Guarding the Chessboard守卫棋盘(迭代加深搜索)

    题意:输入一个n*m棋盘(0<n,m<10),某些格子有标记.用最少的皇后守卫所有带标记的格子.皇后规则是所在坐标的直线和斜线都可以被守卫,长度不限. 分析:因为不知道深度,所以用迭代加深 ...

  9. 迭代加深搜索与埃及分数求解

    迭代加深搜索,实质上是限定下界的深度优先搜索.即首先允许深度优先搜索K层,若没有发现可行解,再将K+1后 重复以上步骤搜索,直到搜索到可行解. 在迭代加深搜索的算法中,连续的深度优先搜索被引入,每一个 ...

最新文章

  1. Mindjet MindManagers思维导图使用记录
  2. 蒙特卡洛算法及其实现
  3. poj 1061 青蛙的约会
  4. python win+r时不成功_Win与R(不使用Anaconda的情况下)
  5. python建模大赛算法_Python数据分析kaggle-Titanic+天池-工业蒸汽量预测建模算法
  6. (84)JTAG接口与格雷码特点-面试必问(八)(第17天)
  7. 华为连发4款手机:配置售价感人
  8. Ckeditor插件
  9. 读“产品经理那些事儿”有感
  10. 第三方库之 - SDWebImage
  11. python论文参考文献5篇_毕业论文参考文献
  12. 几个极速版自动阅读项目的autojs脚本
  13. 图像傅里叶变换的MATLAB实现
  14. 04【副词】(Adverb)位置,形态,时间/频度副词,强调?
  15. 长沙黄花机场大巴车及公交车运行路线与时刻表
  16. JavaWeb_AjaxJson
  17. python操作excel遇到一系列问题
  18. 京东2019春招商业分析试卷[题目整理]
  19. Python 3 字符串 ljust( ) 方法
  20. 网狐二次开发仿爱玩棋牌三网通源码全套安装源码下载

热门文章

  1. 论文工具 | 翻译神器
  2. MySQL怎么存base64编码_MySQL中如何将字符串转为base64编码?
  3. springAop的底层技术
  4. MyBatis相应API
  5. 解决2次查询User的问题(ThreadLocal)
  6. 文件系统对性能的影响
  7. 设计模式之_Strategy_03
  8. Spring注解编程基石(二)
  9. Cortex‐M3-存储器保护单元(MPU)
  10. Data Lake Analytics: 使用DataWorks来调度DLA任务