(一)BFS

1.地牢大师

你现在被困在一个三维地牢中,需要找到最快脱离的出路!

地牢由若干个单位立方体组成,其中部分不含岩石障碍可以直接通过,部分包含岩石障碍无法通过。

向北,向南,向东,向西,向上或向下移动一个单元距离均需要一分钟。

你不能沿对角线移动,迷宫边界都是坚硬的岩石,你不能走出边界范围。

请问,你有可能逃脱吗?

如果可以,需要多长时间?

输入包含多组测试数据。

每组数据第一行包含三个整数 L,R,C 分别表示地牢层数,以及每一层地牢的行数和列数。

接下来是 L 个 R 行 C 列的字符矩阵,用来表示每一层地牢的具体状况。

每个字符用来描述一个地牢单元的具体状况。

其中, 充满岩石障碍的单元格用”#”表示,不含障碍的空单元格用”.”表示,你的起始位置用”S”表示,终点用”E”表示。

每一个字符矩阵后面都会包含一个空行。

当输入一行为”0 0 0”时,表示输入终止。

每组数据输出一个结果,每个结果占一行。

如果能够逃脱地牢,则输出”Escaped in x minute(s).”,其中X为逃脱所需最短时间。

如果不能逃脱地牢,则输出”Trapped!”。

1L,R,C100

  1. 3 4 5
  2. S....
  3. .###.
  4. .##..
  5. ###.#
  6. #####
  7. #####
  8. ##.##
  9. ##...
  10. #####
  11. #####
  12. #.###
  13. ####E
  14. 1 3 3
  15. S##
  16. #E#
  17. ###
  18. 0 0 0
  1. Escaped in 11 minute(s).
  2. Trapped!

    解题思路:一道三维的BFS搜索题,我们可以建立三个移动数组:vxvyvk,分别表示北,南,东,西,上,下,设置一个三维的map数组来存储地图,
    设置一个vis数组,用来判断是否走过以及距离。
    代码:
  1. #include<iostream>
  2. #include<queue>
  3. #include<cstring>
  4. using namespace std;
  5. const int N=110;
  6. int l,r,c;
  7. char map[N][N][N];
  8. int vis[N][N][N];
  9. int vx[]={1,-1,0,0,0,0};
  10. int vy[]={0,0,1,-1,0,0};
  11. int vk[]={0,0,0,0,1,-1};
  12. typedef struct Node
  13. {
  14. int k,x,y;
  15. };
  16. bool check(int K,int X,int Y)
  17. {
  18. if(X<0||X>=r||Y<0||Y>=c||K<0||K>=l)
  19. return false;
  20. if(map[K][X][Y]=='#')
  21. return false;
  22. if(vis[K][X][Y]!=0)
  23. return false;
  24. return true;
  25. }
  26. int bfs(Node start)
  27. {
  28. queue<Node> q;
  29. memset(vis,0,sizeof(vis));
  30. q.push(start);
  31. while(!q.empty())
  32. {
  33. Node tem=q.front();
  34. if(map[tem.k][tem.x][tem.y]=='E')
  35. return vis[tem.k][tem.x][tem.y];
  36. q.pop();
  37. for(int i=0;i<6;i++)
  38. {
  39. int X=tem.x+vx[i];
  40. int Y=tem.y+vy[i];
  41. int K=tem.k+vk[i];
  42. if(check(K,X,Y)==false)
  43. continue;
  44. vis[K][X][Y]=vis[tem.k][tem.x][tem.y]+1;
  45. Node t={K,X,Y};
  46. q.push(t);
  47. }
  48. }
  49. return 0;
  50. }
  51. int main()
  52. {
  53. int i,j,bx,by,bk,k;
  54. Node start;
  55. string ss;
  56. while(1)
  57. {
  58. cin>>l>>r>>c;
  59. if(l==0&&r==0&&c==0)
  60. break;
  61. for(k=0;k<l;k++)
  62. {
  63. for(i=0;i<r;i++)
  64. {
  65. for(j=0;j<c;j++)
  66. {
  67. cin>>map[k][i][j];
  68. if(map[k][i][j]=='S')
  69. {
  70. bk=k,bx=i,by=j;
  71. start={bk,bx,by};
  72. }
  73. }
  74. }
  75. getline(cin,ss);
  76. }
  77. int ans=bfs(start);
  78. if(ans)
  79. cout<<"Escaped in "<<ans<<" minute(s)."<<endl;
  80. else
  81. cout<<"Trapped!"<<endl;
  82. }
  83. return 0;
  84. }

2.全球变暖

你有一张某海域 N×N 像素的照片,”.”表示海洋、”#”表示陆地,如下所示:

  1. .......
  2. .##....
  3. .##....
  4. ....##.
  5. ..####.
  6. ...###.
  7. .......

其中”上下左右”四个方向上连在一起的一片陆地组成一座岛屿,例如上图就有 2 座岛屿。

由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。

具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。

例如上图中的海域未来会变成如下样子:

  1. .......
  2. .......
  3. .......
  4. .......
  5. ....#..
  6. .......
  7. .......

请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。

第一行包含一个整数N。

以下 N 行 N 列,包含一个由字符”#”和”.”构成的 N×N 字符矩阵,代表一张海域照片,”#”表示陆地,”.”表示海洋。

照片保证第 1 行、第 1 列、第 N 行、第 N 列的像素都是海洋。

一个整数表示答案。

1N1000

  1. 7
  2. .......
  3. .##....
  4. .##....
  5. ....##.
  6. ..####.
  7. ...###.
  8. .......
  1. 1
  1. 9
  2. .........
  3. .##.##...
  4. .#####...
  5. .##.##...
  6. .........
  7. .##.#....
  8. .#.###...
  9. .#..#....
  10. .........
  1. 1
  1. 解题思路:每一层的个数都是=2n-1个,而且开头的下标都是2的倍数
    代码:
  1. #include<iostream>
  2. using namespace std;
  3. const int N=100010;
  4. typedef long long ll;
  5. ll a[N];
  6. ll maxn,sum,ans;
  7. int main()
  8. {
  9. ll i,j,n,k;
  10. cin>>n;
  11. for(i=1;i<=n;i++)
  12. cin>>a[i];
  13. maxn=a[1];
  14. ans=1;
  15. k=1;
  16. for(i=2;i<=n;i=i*2)
  17. {
  18. sum=0;
  19. for(j=i;j<=i*2-1&&j<=n;j++)
  20. {
  21. sum+=a[j];
  22. }
  23. k++;
  24. if(sum>maxn)
  25. {
  26. maxn=sum;
  27. ans=k;
  28. }
  29. }
  30. cout<<ans;
  31. return 0;
  32. }

 

  1.  

版权声明:本文为xiaofengzai原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/xiaofengzai/p/12245991.html