题意:

就是按照A->B->C->D....去拿,求步数;

思路:

有一个注意点:如果碰到合法字母吃掉,再以后的某次可以重新到改点;

BFS的因为标记而减少了重复位置的到达,但是按照题目,窝从A->B吃了B以后,我后面还是要以合法并且最短的方法到C,所以...

有一种方法,就是我BFS最多26次,每次走个A->B/B->C/C->D/.../Y->Z,一步一步走;

还有就是搞一个BFS,然后中间初始化一下就好了。

总的还是相同的。

这道题目深刻地理解BFS就是起点到终点的一个过程~(●'◡'●)也像走一步再走一步

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long LL;
  4. typedef unsigned long long ULL;
  5. typedef pair<int,int>PII;
  6. const double eps=1e-5;
  7. const double pi=acos(-1.0);
  8. const int mod=1e9+7;
  9. const int INF=0x3f3f3f3f;
  10. char ma[15][15];
  11. bool vis[15][15];
  12. int dx[4]={0,0,-1,1};
  13. int dy[4]={1,-1,0,0};
  14.  
  15. int n;
  16. struct asd{
  17. int x,y;
  18. int step;
  19. };
  20.  
  21. int main()
  22. {
  23. int T,cas=1;
  24. scanf("%d",&T);
  25. while(T--)
  26. {
  27. scanf("%d",&n);
  28. for(int i=0;i<n;i++)
  29. scanf("%s",ma[i]);
  30. bool flag;
  31. int flat=0;//记录终点字母;
  32. int sx,sy;
  33.  
  34. for(int i=0;i<n;i++)
  35. {
  36. for(int j=0;j<n;j++)
  37. {
  38. if(ma[i][j]=='A')
  39. {
  40. sx=i;
  41. sy=j;
  42. }
  43. if(ma[i][j]>='A'&&ma[i][j]<='Z')
  44. {
  45. if(ma[i][j]>flat)
  46. flat=ma[i][j];
  47. }
  48. }
  49. }
  50. printf("Case %d: ",cas++);
  51. if(!flat)
  52. {
  53. puts("Impossible");
  54. continue;
  55. }
  56. memset(vis,0,sizeof(vis));
  57. queue<asd>q;
  58. while(!q.empty())
  59. q.pop();
  60. asd now,ne;
  61. int ans,num;
  62. now.x=sx;
  63. now.y=sy;
  64. now.step=0;
  65. vis[sx][sy]=1;
  66. num=1;
  67. ans=0;
  68. flag=false;
  69. q.push(now);
  70. while(!q.empty())
  71. {
  72. now=q.front();
  73. q.pop();
  74. if(ma[now.x][now.y]==('A'+num))
  75. {
  76. ans+=now.step;
  77. if(flat==('A'+num)) //如果是终点,再见;
  78. {
  79. flag=true;
  80. break;
  81. }
  82. num++;
  83.  
  84. //初始化,以这个点为起点,搜下一个字母;
  85. memset(vis,0,sizeof(vis));
  86. while(!q.empty())
  87. q.pop();
  88. now.step=0;
  89. vis[now.x][now.y]=1;
  90. }
  91. for(int i=0;i<4;i++)
  92. {
  93. int x=now.x+dx[i];
  94. int y=now.y+dy[i];
  95. if(x<0||y<0||x>=n||y>=n||vis[x][y]||ma[x][y]=='#'||ma[x][y]>('A'+num))
  96. continue;
  97. vis[x][y]=1;
  98. ne.x=x;
  99. ne.y=y;
  100. ne.step=now.step+1;
  101. q.push(ne);
  102. }
  103. }
  104. if(flag||flat=='A')
  105. printf("%d\n",ans);
  106. else
  107. puts("Impossible");
  108. }
  109. return 0;
  110. }
  111. /*
  112. 2
  113. CB
  114. .A
  115. 3
  116. A..
  117. .BD
  118. #C#
  119. */

lightoj1066【BFS】的更多相关文章

  1. 【bfs】抓住那头牛

    [题目] 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0≤N≤100000),牛位于点K(0≤K≤100000).农夫有两种移动方式: 1.从X移动到X-1或X+1,每次 ...

  2. 【bfs】拯救少林神棍(poj1011)

    Description 乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位.然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度.请你 ...

  3. 【bfs】Knight Moves

    [题目描述] 输入nn代表有个n×nn×n的棋盘,输入开始位置的坐标和结束位置的坐标,问一个骑士朝棋盘的八个方向走马字步,从开始坐标到结束坐标可以经过多少步. [输入] 首先输入一个nn,表示测试样例 ...

  4. 【bfs】1252 走迷宫

    [题目描述] 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走:有的格子是空地,可以走. 给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到).只能在水平方向或垂直方向走,不 ...

  5. 【bfs】献给阿尔吉侬的花束

    [题目描述] 阿尔吉侬是一只聪明又慵懒的小白鼠,它最擅长的就是走各种各样的迷宫.今天它要挑战一个非常大的迷宫,研究员们为了鼓励阿尔吉侬尽快到达终点,就在终点放了一块阿尔吉侬最喜欢的奶酪.现在研究员们想 ...

  6. 【bfs】迷宫问题

    [题目描述] 定义一个二维数组: int maze[5][5] = { 0,1,0,0,0, 0,1,0,1,0, 0,0,0,0,0, 0,1,1,1,0, 0,0,0,1,0, }; 它表示一个迷 ...

  7. 【bfs】仙岛求药

    [题目描述] 少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶.叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发现仙药摆在了迷阵的深处.迷阵由M×N个方格组成,有的 ...

  8. 【bfs】BZOJ1102- [POI2007]山峰和山谷Grz

    最后刷个水,睡觉去.Bless All! [题目大意] 给定一个地图,为FGD想要旅行的区域,地图被分为n*n的网格,每个格子(i,j) 的高度w(i,j)是给定的.若两个格子有公共顶点,那么他们就是 ...

  9. poj3278-Catch That Cow 【bfs】

    http://poj.org/problem?id=3278 Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submis ...

随机推荐

  1. linux的su和sudo(转载)

    来源:http://www.jb51.net/LINUXjishu/12713.html 一. 使用 su 命令临时切换用户身份 1.su 的适用条件和威力 su命令就是切换用户的工具,怎么理解呢?比 ...

  2. activity fragment 转场动画

    http://www.cnblogs.com/avenwu/p/3372736.html v4 fragment fragmentTransaction.setCustomAnimations(R.a ...

  3. 嵌入式流媒体音视频服务器EasyIPCamera中live555发送性能优化点

    EasyIPCamera流媒体服务器 今年EasyDarwin团队在给国内某最大的金融安防公司做技术咨询的时候,开发了一款适用于嵌入式IPCamera.NVR的RTSP流媒体服务器:EasyIPCam ...

  4. mybatis学习总结(二)——配置

    在mybatis中要构建sqlSessionFactory对象,让它来产生SqlSession,而在mybatis-spring中,SqlSession的产生是通过SqlSessionTemplate ...

  5. (转)CentOS6.5安装Darwin Streaming Server搭建RTSP流媒体服务器

    参考: 1,CentOS6.5安装Darwin Streaming Server搭建RTSP流媒体服务器 http://www.yimiju.com/articles/567.html

  6. 【C++基础学习】成员对象与对象数组

    第一部分 对象成员与对象数组 从一个简单的例子开始说起,首先定义一个Coordinate的类,里面有两个公有的成员变量m_iX和m_iY,分别代表横坐标和纵坐标. 接下来,定义一个对象数组cood和一 ...

  7. Anroid事件分发

    因为最近因个人原因离职,面试的时候,有人问到了Android中事件分发机制的过程,因为忘得差不多了,没答好,所以回来后,想写了个Demo,重新复习一遍. 一般来说,Android的组件其实可以分为两类 ...

  8. Vue.js的动态组件模板

    组件并不总是具有相同的结构.有时需要管理许多不同的状态.异步执行此操作会很有帮助. 实例: 组件模板某些网页中用于多个位置,例如通知,注释和附件.让我们来一起看一下评论,看一下我表达的意思是什么.评论 ...

  9. poj 1743 Musical Theme【后缀自动机】

    不是很神的一道题,一般. 先差分,最后答案需要+1. 一个right集的len即为该right集的最长相同后缀,考虑到不能重复,所以处理一下该right集的最大与最小的ri,最后答案ans=max(a ...

  10. android:textAppearance

    Android之系统自带的文字外观设置及实际显示效果图 android:textAppearancexml布局里面设置文字的外观: 如“android:textAppearance=“?android ...